Chrome拡張を使って認証器なしでWebAuthnのAPIを呼ぶ

2020.02.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

出先でたまたま認証器がない状態で WebAuthn の API を叩きたいというイベントが稀に発生するのですが、WebAuthn.io という WebAuthn のデモサイトで紹介されていた Chrome拡張で認証器をもっていなくても API を叩けることを知ったので紹介させていただきます。

使い方

Virtual Authenticators Tab | chrome ウェブストアからインストールします。

Chrome 80 以上のバージョンが推奨、とのことです。

インストールしてからデベロッパーツールを開くと、Virtual Authenticators というタブが追加されています。

Enable Virtual Authenticator Environment をチェックすると、仮想認証器が有効化します。

有効化すると認証器が接続されている時のように API を呼ぶことができます。

いわゆる認証器をタップするなどのユーザーの存在チェックなどは行われず、特に何もしなくても API のレスポンスが返ってくるようです。

認証器の追加

いまいち仕様が理解しきれていないのですが、この Chrome 拡張には属性を指定した認証器を追加する機能があります。

  • プロトコル
  • 接続方式
  • レジデントキーをサポートするかどうか
  • User Verification をサポートするかどうか

上記の属性が指定可能です。

認証器を一つも追加していない状態では、

  • プロトコル:ctap2
  • 接続方式:usb
  • レジデントキーをサポートするかどうか:false
  • User Verification をサポートするかどうか:false

としての動作となるようです。ちなみに aaguid は 01020304-0506-0708-0102-030405060708 でした。

ここで、例えば authenticatorSection の userVerification を required にして実行したい場合、Add Authenticator で認証器を追加します。

作成すると一覧に認証器が追加されます。

この状態だと navigator.credentials.get を userVerification="required" で呼び出すことができます。 ただし、ここの挙動がいまいち理解しきれていないのですが、この呼び出しが成功したり失敗したりします。 なんとなくなのですが、デフォルトの認証器と、追加した認証器のどちらかがレスポンスを返していて、デフォルトが選ばれた?場合はエラーになっている気がします。

エラーとなる場合、以下のようなエラーとメッセージが返ってきます。

NotAllowedError:The operation either timed out or was not allowed. See: https://w3c.github.io/webauthn/#sec-assertion-privacy.

Credentials の一覧からは、生成したクレデンシャルを消したり秘密鍵をダウンロードしたりできます。

まとめ

Virtual Authenticators Tab を利用すると、手元に認証器がなくても WebAuthn の API を呼び出すことが可能です。

私からは以上です。