Open4

携帯電話のPasskeyはもう使えるメモ

okuokuokuoku

別件で実装を調べてたら、もう各社のデバイスには(iOS16とか今後のAndroidのアップデートを待たずに)実装が入ってたので試してみた。

okuokuokuoku

WebAuthnなサイトでQRコードを出す

Windows上でChrome Canaryを使って、WindowsのFIDOプロンプトをひたすらキャンセルしていると最終的にQRコードを尋かれる。

この "Use phone with a QR code" は従来の"Add a new Android phone"(J: "新しいAndroidスマートフォンを追加")から変更されている。まぁiPhoneにも対応したしね。。

https://chromium-review.googlesource.com/c/chromium/src/+/3823726/3/chrome/app/generated_resources.grd

表示されるQRコードは FIDO:/ で始まるEfficient QR codes https://www.imperialviolet.org/2021/08/26/qrencoding.html (10進エンコードを使ったバイナリのコンパクト表現)で、CBORエンコードされた公開鍵や接続先情報になっている。

https://github.com/chromium/chromium/blob/2edb2e5b6179366c0f2153597e9b1a6e4cae1491/device/fido/cable/v2_handshake.cc#L325

これをAndroidやiOSのカメラでスキャンすると、passkeyを携帯電話にコピーしたり、それを使用したりできる。

PC側要件

Bluetooth LEのアドバタイズを受信できる環境が必要になる。LEじゃないBluetoothだけになったら何が起こるのかは不明。

電話側要件

細かいプロトコルはWebSocket経由で実施されるので、電話側にもネットワーク接続が必須。また、近接検出のためにBluetooth LEも必要。

手元の環境では、接続先のサーバーは wss://cable.ua5v.com/cable/connect/2219B3/C2A97D05A31E6C5B2A3344F7E8E5F052 (Pixel5aの場合) とか wss://cable.auth.com/cable/connect/4D444C/9EAA66E2E3522BD78563DD349C1F33D1 (iOS15の場合) だった。

このアドレスはGoogle Chrome側にハードコードされているので、任意にサーバを立てたりするわけにはいかないようだ。

https://github.com/chromium/chromium/blob/2edb2e5b6179366c0f2153597e9b1a6e4cae1491/device/fido/cable/v2_handshake.cc#L120-L122

okuokuokuoku

iOS 15の場合

標準のカメラアプリでQRコードをスキャンすると警告される:

同期プラットフォームの認証機能って何だよ。。指示通りXcodeとペアリングしてDeveloper → Syncing Platform Authenticator をオンにすることでUIを使用できる。

ただし、iPod touchだと一度設定したPasskeyをサイトで使うことができなかった。iPadでは正常に使えたので、もうこの時点でiOS16非対応デバイスはハブられているんだろうか。。

また、Androidと違って、PC側の接続情報を覚えさせる機能が現時点では無く、都度QRコードを読ませる必要があるのもちょっとダサい。たぶんiOS16正式リリース時にはなんとかなるんだろうが。。

okuokuokuoku

Android(Pixel5a)

Pixel5aの標準カメラアプリでQRコードをスキャンすると "このパソコンの情報を保持する" のチェックボックス付きの画面があらわれ、これにチェックを入れた状態にしておくと、

  • 以降ChromeからWebAuthnする際に選択肢として表示されるようになる
  • Windows側のFIDOが使われなくなる

追加された"Pixel5a"を選択すると、QRコードのスキャン不要で直接 ネットワーク経由で 接続するようになる( wss://cable.ua5v.com/cable/contact/... )。