FIDO U2F Second-Factor Authentication

パスワード認証にフィッシング耐性のあるSecurity Key操作を追加し、公開鍵署名で第二要素を証明する従来FIDOフローです。

Legacy flow — 新規実装では使用しないでください
ModelSecond factor
DeviceSecurity key
SuccessorFIDO2 / WebAuthn

このフローで、
何をするの?

このフローのゴール

アプリへパスワードを渡さず、許可された範囲だけAPIを利用できるようにします。

01まず全体像

ユーザーはAuthorization Serverでログインし、クライアントへ渡してよい権限を選びます。クライアントは短時間有効な認可コードを受け取り、安全なバックチャネルでアクセストークンへ交換します。

02身近な例で考える

ホテルの受付で本人確認を行い、部屋の鍵ではなく、許可された施設だけに入れる一時的なカードを受け取るイメージです。

03最後にどうなる?

クライアントはアクセストークンを使い、ユーザーが同意した範囲のAPIだけを呼び出せます。

登場人物

図では、縦の列ごとに担当者やシステムを分けています。

U
User

サービスを利用する人です。ログインや同意、端末の操作を行います。

B
Browser

WebサイトとAuthenticatorの間を安全につなぎ、WebAuthn APIを実行します。

A
Authenticator

秘密鍵を安全に保管し、生体認証やPINの確認と署名を行う端末機能です。

R
Relying Party

ユーザーをログインさせるWebサービスです。公開鍵を保存し、署名を検証します。

図の読み方: 光る丸が今説明している通信です。自動再生を止めたいときは「Pause」を押し、気になる矢印を選んでください。

Interactive sequence
UUserAuthorization Gesture
BBrowserWebAuthn Client
AAuthenticatorPlatform / Roaming
RRelying PartyApplication Server
01

User Relying Party

第一要素でログイン

このステップで行うこと

ユーザー名とパスワードなどの第一要素を検証します。

なぜ必要?

U2F単体はユーザー識別を置き換えず第二要素として使われます。

このあと

次は「U2F challengeを返却」へ進みます。

REQUEST / RESPONSE EXAMPLEBrowser → Authorization Server
REQUEST
POST /login
Content-Type: application/x-www-form-urlencoded

username=user&password=********
レスポンス
HTTP/1.1 302 Found
Location: https://client.example/api/auth/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=af0ifjsldkj
Cache-Control: no-store

値の引き継ぎ: Authorization Serverがcodeを新しく発行し、Locationのクエリへ入れます。stateは最初の認可リクエストでClientが送った値を、そのまま返したものです。ブラウザはこのLocationへ自動的に移動するため、次のステップでは同じcodeとstateを持つGETリクエストが発生します。

※ トークン、challenge、Credential IDなどは説明用に短縮したサンプル値です。

同じ仕様のフローを、続けて理解する。