ぼくがかんがえるさいきょーのpasskey

この記事は Calendar for 東京電機大学 | Advent Calendar 2022 - Qiita の4日目です。

昨日は、HIBIKI-CUBEさんの ESP32でYDLiDAR GS2を使う - Qiita でした。


passkeyというものを知っていますか?passkeyとはFIDO/WebAuthnという仕様に沿って実装される機能の"名称"で、正式にはマルチデバイス対応FIDO認証資格情報と呼ばれパスワードの代わりに端末の生体認証などを使用して認証できるようにするものです*1

Appleではパスキーが、GooglepasskeyAndroidChromeで実装しています。

この夢の技術を使用するとWebサービスのログイン*2にパスワードを必要とすることなくログインができるようになります。しかし、以下の記事で話題が出ているようにAppleのパスキーなどはキーチェンで複数端末で共有されるため、複数のパスキーを1ユーザに登録させるときに結構悩む問題が発生します。

www.docswell.com

上記スライドでYahoo! JapanはUX体験を上げるためWebAuthnを自動発動しておりキーチェンで共有している場合UAが一致していないためうまく認証ができない。そのため、ベターな案としてWebAuthnが確実に成功する場合は自動発動をし、それ以外はユーザに選択させるという方法を提案しています。

ぼくのかんがえるpasskey

私も考えます。必要条件として、

  1. passkeyは1ユーザで複数登録できる(しかし1端末に2つ以上は登録できない。iPhoneAndroid端末で別々などという意味)
  2. できるだけpasskeyを有効にしている場合自動発動させたい
  3. 認証に失敗してユーザにガッカリ体験はあまり扨せたくない

とします。

まず、1の複数登録できるに関してはなににせよUserAgentかClientHintsを使用して使用しているデバイス、OSを判定する必要があると思います。これをしないとiPhoneで複数のpasskeyを登録できてしまったりする可能性があるためです。

で、自動発動についてですが、これはユーザが登録しているpasskeyが1つの場合 && passkeyを登録している端末の場合のみ自動発動するのが一番良いと考えます。
こうすることで、iPhoneでパスキーを登録して、iPhoneでログインした場合はWebAuthnを自動発動し、キーチェンで共有しているiPadでは自動発動はせずにユーザに従来のログイン方法を使用するかpasskeyを使用するかを選ばせることでエラーが発生してガッカリ体験ということが少なくなると思います。キーチェンで登録している別端末などでは1度passkeyでログインしたらサービス側のDBにUserAgent情報を追記して次回からその端末でも同じpasskeyを自動発動するようにするとなおいいと思います。

認証フローイメージ

graph TD A[認証スタート] --> B{passkeyを登録しているか} B-->|Yes| C{登録しているpasskeyは1つか} B-->|No| F[従来の認証方法へ] C-->|Yes| D{そのpasskeyはその端末のものか} C-->|No| G[クレデンシャルを選択か従来の認証か] G--> I[そのpasskeyに端末を追加] D-->|Yes| H[WebAuthn自動発動] D-->|No| G

F-->W[ログイン完了]
I-->W
H-->W

みんなpasskey実装しようぜ!

中高生のパスワードとか名前+誕生日とかザラにあって、さらに使いまわしとか当たり前なので全Webサービスはpasskey実装したほうがいいと思います。

*1:https://www.publickey1.jp/blog/22/googlepasskeyandroidandroidwinmacweb.html より引用

*2:Webサービスでpasskeyを使用するにはWebAuthn APIを使用する必要があります