Passkey's Tips: パスキーが同期されているかどうかを判定する
ritouです。
パスキーの登録やパスキーの認証を実装するサービスが増えてきました。
この次のステップとして、必須ではないがこの辺りの細かいことができたら便利になるかなーというあたりを紹介していきます。
同期されているかの判別方法
仕様
"Web Authentication: An API for accessing Public Key Credentials Level 3" にて定義されています。 "6.1.3. Credential Backup State" を見てみましょう。
Backup Eligibility (BE) と Backup State (BS) というフラグが使えるとあります。
Flagsはパスキーの登録時のAttestation、パスキーによる認証時のAssertionに含まれるAuthenticatorDataの中に含まれます。
これはLevel 2まではReserved for future use (RFU2)が3bitぶん確保されていたものがLevel 3になってBE, BS, RFU2が1bitずつに変わった部分です。
BE, BSと2種類あるのはバックアップができるかどうかと、実際にされているかどうかの組み合わせを表現しています。
最初のスクリーンショットのように、両方1であれば利用されたパスキーは同期されている、と扱えます。
使い所
"6.1.3. Credential Backup State" の続きに使い所が書いてあります。
RP(パスキーを利用するサービス)側はこれらのフラグの最新の値を保存しつつ、その値や値の変化に応じて次のような機能として利用できます。
- バックアップされていない時にAuthenticatorの追加を要求
- バックアップされていない->バックアップされているという変化があったら、パスワードを無効化するなどしてパスワードレスアカウントへマイグレーションを行う
- バックアップされていたものからそうでなはくなった、という状態変化後に別の認証要素を追加する
1番目と3番目の表記を見ると、仕様のドキュメントがまだ洗練されていない感じはありますが、
- バックアップされていない: 端末が壊れたりなくなると "ログインできない状態になりうる" ので2つ目のパスキーを要求したり、パスワード認証によるログイン方法を残さないといけない
- バックアップされている: ある程度 "リカバリー可能な状態" になるのでパスワードレスいける?
みたいな認識に見て取れます。まぁ、こういう流れですよねと。
ただし、パスキー関連のブログに対する反応を見れば分かる通り、"アカウントに紐づけて同期?しなくていい。危ないだけ"みたいな考えの方もそれなりにいるようなので、パスワードマネージャー側で今後はより柔軟にバックアップをするかどうかをユーザーが選択できるようになる可能性もあります。今回紹介した使い所をそのままサービスに導入できるかどうかは、状況を見ながらの検討が必要でしょう。
実装難易度
自分のところではライブラリを内製しているのですが、このFlagはこれまでも UserVerification の判定で利用しており、Lv2からLv3になって定義が拡張されてもこれまで予約されていた部分が解放されただけなのでちょっと直すだけで対応可能でした。
実際にパスキー登録時の結果を確認してみました。
Safariで生成したパスキーはtrue/trueでした。
Androidで生成したパスキーはtrue/trueですね。
MacOSのChromeで生成したパスキーはfalse/falseでした。
1Passwordでもtrue/trueでした。
同期できるけどしない、みたいなパスキーはどう作ったらええんや感がありますが、とりあえず動作確認としては OKとします。
どちらかというと、このようにライブラリがパースした結果をサービス側がどう扱うかの方が重要でしょう。登録、認証結果からこれらの値を取ることは簡単なので、あとはそれを毎度更新しつつ状態変化が起こった際は何かアクションを要求できるように準備しておくと今後プラクティスが出てきた時に楽に対応できるかもしれません。
次回の予定
これからも今回のようなTipsシリーズを書いていく予定です。
次回は、
- iPhoneやAndroidでパスキーを登録してログインできるようになった
- Windows PCやMacOSのChromeのように、登録したパスキーが同期されていない端末からHybrid Transportを使ってログインした
- この端末でもパスキーを管理できるので、Hybrid Transportやセキュリティキーでログインしたことを検知したらこの端末でもパスキー登録に誘導したい
みたいな時にどうやったらいいか、みたいなのを調べた話を書こうと思います。
ではまた。
Discussion