Open5
WebAuthn メモ
モチベーション
- 自社サービスで WebAuthn を提供したい
- Cloudflare Workers で完結して WebAuthn 機能を提供したい
- メール認証をベースとして WebAuthn を追加で設定できるようにしたい
- Passkeys を利用できるようにしたい
- Cloudflare Workers の Service Binding を利用して env.webauthn.fetch("/register-challenge") とか呼べるようにしたい
- Cloudflare Workers だけで動く依存ライブラリがない WebAuthn サービスを利用する
状況
- 自社サービスに導入するために 1 から調査しながら実装している
- 採算度外視でよい
- TypeScript で頑張って書いてるが辛くなって Erlang/OTP で書き直す可能性あり
- ただそのサーバやデータベースを運用することを考えると Cloudflare Workes の方が現実的
-
nealfennimore/passkeys: Passkeys demo using Cloudflare Workers, KV, and D1
- 一通りやりたいことやってそう
-
webauthn-open-source/fido2-lib: A node.js library for performing FIDO 2.0 / WebAuthn server functionality
- 依存が少なめのライブラリ
-
kriszyp/cbor-x: Ultra-fast CBOR encoder/decoder with extensions for records and structural cloning
- Cloudflare Workers で問題無く動く CBOR ライブラリ、これを使うのがよさそう
ritou
Yubico
WebAuthn
-
Web Authentication: An API for accessing Public Key Credentials - Level
- 大元の資料
- 必ず最新版を見ること
-
passkeys.dev - Home
- まずはここ
-
Passwordless sign-in on forms with WebAuthn passkey autofill - Chrome Developers
- これを見て WebAuthn の導入を決めた
- Explainer: WebAuthn Conditional UI · w3c/webauthn Wiki
- Create a passkey for passwordless logins
- Sign in with a passkey through form autofill
-
https://www.okta.com/sites/default/files/2020-08/How_WebAuthn_Works_JP.pdf
- Okta の資料 2020 年なので少し古い
- WebAuthn & Passkeys by Christiaan Brand, Tim Cappalli, Megan Shamas, TPAC 2022: Prerecorded group updates & demos
-
WebAuthnことはじめ | メルカリエンジニアリング
- 2019 年なので少し古い
- スゴイわかりやすい
- 次世代の認証技術 WebAuthnを紹介【前編】 | TECH | NRI Digital
-
Web Authentication (WebAuthn) Credential and Login Demo
- Auth0 が提供しているデモ
-
パスキーの概要 - Apple Developer
- Apple の解説
- ヤフーにおける WebAuthn と Passkey の UX の紹介と考察 #idcon #fidcon | ドクセル
- Yahoo! JAPAN、安全なパスワードレス認証を、より利便性高く利用できる“パスキー”に対応 - ニュース - ヤフー株式会社
-
Passkey autofillを利用したパスワードレスログイン導入で得たものと、得られなかったもの - Money Forward Developers Blog
- autofill の解説がとてもわかりやすい
-
github/webauthn-json: 🔏 A small WebAuthn API wrapper that translates to/from pure JSON using base64url.
- Uint8Array をうまいこと扱ってくれる JSON ラッパー
CBOR
Authenticator Data
Web Authentication: An API for accessing Public Key Credentials - Level 3
- attestationObject を CBOR デコード
- fmt, sig, authData が含まれる
- authData のフォーマット
WebAuthn 雑感
3 日目
便利で簡単に使える裏にあまりにも膨大な仕様があり、はっきり言ってこれを自社サービスに自社で頑張って実装する必要はないと思う。ただこれフレームワークを導入するにしても仕組みを理解してないと恐くて使えない気がするのも難点。
そもそも導入しても既存の認証に対してパスワードレス認証を適用するという仕組みなので、はっきり言って魅力がない。
- あまりにも複雑すぎる
- register / authenticate というシンプルな仕組みなのに中身が複雑すぎる
- 仕様が膨大すぎる
- CBOR ありきなのが微妙
- COSE ありきなのが微妙
- ブラウザ毎に実装が異なる
- ハードウェアキー毎にも実装が異なる
- 拡張 (extensions) がだるそう
- 実装するのであれば〜に対応しているという制限をかけていくのが現実的におもえる
自分のモチベーションとしては Cloudflare Workers で気軽に動かせるというのがあるので、ほぼ自前実装している。CBOR (cbor-x) と COSE (まだ見つけてない) はライブラリ依存にする予定。
WebAuthn API がサーバーとのやりとりありきの API を持ってるくせに、 Uint8Array という JSON 化できない値をそのまま使ってるのが理解に苦しむ。そもそも base64url でエンコードした値をそのまま食べさせられるという実装を作っても良かったのではないか。
4 日目
- COSE 実装しているが、本当に使用がひどい
- Web Crypto を使うために色々自前で頑張る必要があるのひどい
- YubiKey 5C でとりあえず register まではできた
- RS256 は対応しないことにした