😵

WebAuthnで"Client-side discoverable Credential"の挙動を確認する(非対応環境)

2022/08/21に公開

ritouです。

今回は何をするのか

前回、"Client-side discoverable Credential"に対応している環境での挙動を確認しました。

https://zenn.dev/ritou/articles/d0c61304f815d1

今回は"Client-side discoverable Credential"に対応していない環境での挙動を確認します。

Android端末でChromeとFirefoxの挙動を見てみます。

"Client-side discoverable Credential" を指定して PublicKey 作成

https://twitter.com/ritou/status/1560590849607880704

これに対して "preferredでやれ" とリプライもらったりしましたが、
仕様通り option.authenticatorSelection.residentKey の値によって動作が変わります。

  • required 対応していない環境ではエラーになります
    • This value indicates the Relying Party requires a client-side discoverable credential, and is prepared to receive an error if a client-side discoverable credential cannot be created.
  • preferred 対応していない環境では "server-side credential" が作成されます。
    • This value indicates the Relying Party strongly prefers creating a client-side discoverable credential, but will accept a server-side credential. For example, user agents SHOULD guide the user through setting up user verification if needed to create a client-side discoverable credential in this case. This takes precedence over the setting of userVerification.

後者で作成された PublicKey が "Client-side discoverable Credential" かどうかを Client Extension の rk という値で判別できそうですが、仕様を読むと完全ではなさそうでこれまた悩ましいです。

If rk is not present, it is not known whether the credential is a discoverable credential or a server-side credential.

Therefore a missing rk indicates that the created credential is most likely a non-discoverable credential.

"Client-side discoverable Credential" を利用した認証要求

option.publicKey.allowCredentials に空の配列を指定してやると、非対応の環境ではエラーが返されます。

https://twitter.com/ritou/status/1560834092316651520

このエラーが綺麗に揃っているならば、

  1. option.publicKey.allowCredentialsに空を指定して認証要求
  2. エラーなのでRPはユーザーに識別子を入力させ、公開鍵を参照して指定

みたいなフォールバックもできそうかなって思いましたが、環境によってエラーの内容が変わったりするのは面倒そうですね。

今回のまとめ

非対応な環境での挙動を見てみました。

  • PublicKey生成時には residentKey=preferred を指定してやれば "Client-side discoverable Credential" への対応状況に従いつつ PublicKey を生成する
  • 認証要求時に allowCredentials[] を指定すると非対応環境ではエラーが返されるが、Client(ブラウザ)によってエラーが変わるっぽい

なんでこれ調べてるかっていうと、"Client-side discoverable Credential"に対応/非対応な環境が混ざってる状態でどうやって使っていったらええんやってことを考えているのですが、なかなかうまく行かなそうな予想通りになってきたのでもう少し考えたいと思います。

ではまた。

Discussion