PassKey
古くからあるパスワード方式に代わる方式
W3C WebAuthn がベースになっている。
https://w3c.github.io/webauthn/ (ドラフト)
https://www.w3.org/TR/webauthn-3/ (公式)
基本的にはURLに対して公開鍵暗号による鍵ペアを発行して、その鍵ペアが一致している時に認証する。
鍵ペアはユーザーのデバイスが発行し、サービス側に公開鍵を伝達する。ユーザーはパスワードを考える必要がない。
鍵ペアは特定のデバイスに記録される。ブラウザ自体がユーザーを認証して、その上で鍵ペアのあるデバイスで認証する。
PassKeyの限界
ユーザーがデバイスにログインできている(=認証されている)状態ならば正当とみなされる。
ログイン済みのデバイスが放置されていて他者に操作された時には PassKey は無力である。
ログイン状態が放置されないようにする。(スクリーンロックや自動ログアウトなど)
これを防ぐためには、何らかの別要素による認証を組み合わせる必要がある。(いわゆる2要素認証)
メールやSMSによる認証でも同一デバイスに到着するのでは意味がない。
メモ書き
クライアントがサーバーに登録要求を出す。
この時、user は少なくとも必要。単純化すると user と displayName が必要。
プロトコルは定まっていないので、データだけ渡ればなんでも良い。
サーバーから登録要求の応答を返す。
navigator.credentials.create に渡すためのデータを返す。
code:json
{
rp: {
name: "サービス名",
id: "ドメイン名"
},
challenge: "ランダムな文字列",
メモ
[入門] Webでパスキーを実装する https://zenn.dev/hakoten/books/c9718954916f82
WebAuthn Level2 と Level3 の違いを見る https://zenn.dev/gebo/scraps/28d3e03137107a
WebAuthn の get() と create() のレスポンス一覧(Level 3) https://zenn.dev/inabajunmr/articles/publickeycredential
はじめての WebAuthn https://developers.google.com/codelabs/webauthn-reauth?hl=ja#0