CIBA 委譲
ブラウザのサインイン画面では認証せず、スマートフォンでの承認だけでログインを完了させる構成です。
認可コー ドフローの認証を、CIBA フローへ委譲します。
こんなときに使います
- PCのブラウザでログインするが、認証はスマートフォンだけで完結させたい
- PCにパスワードを入力させたくない(共用PC、店頭端末、キオスク)
- 認証の実体を別の認可サーバーに任せたい(グループ会社の認証基盤など)
ユーザー体験
PCのブラウザ スマートフォン
│ │
├─ サービスにアクセス │
├─ メールアドレスを入力 │
│ ├─ 通知が届く
│ 「スマートフォンで承認してください」 │
│ (画面はぐるぐる待機) ├─ 顔認証で承認
│ │
├─ ログイン完了 │
PCではパスワードを入力して本人を特定し、その先の承認はスマートフォンで行います。
仕組み
サインイン画面は、認証を外部API認証(external-api-authentication)経由で認可サーバーの CIBA に委譲します。
| ステップ | 動作 |
|---|---|
| 1. 開始 | サインイン画面が CIBA を開始する。auth_req_id はサーバー側に保持される |
| 2. 待機 | サインイン画面がポーリングする。承認前は authorization_pending |
| 3. 承認 | ユーザーがスマートフォンで生体認証する |
| 4. 完了 | ポーリングが成功し、userinfo でユーザーが確定する |
idp-server のコード変更は不要です。 設定だけで組めます。
委譲先はどこでもよい
このテンプレートでは、委譲先の認可サーバーを同じテナント自身にしています。third party を用意しなくても全経路を試せます。
実運用では、認証設定の URL とクライアント資格情報を委譲したい相手のものに差し替えれば、別の認可サーバーへ委譲できます。
使い方
委譲は、ユーザーを特定してから使います。 パスワード認証で本人を確定させたうえで、承認をスマートフォンに委ねます。
acr_values | 認証 |
|---|---|
urn:idp:acr:password-ciba | パスワード → CIBA 委譲 |
| 指定なし | パスワード / 初期登録 |
identity_match_field により、デバイスで承認した人がパスワードを入力した人と同一かが検証されます。別人が承認しても通りません。
委譲だけで認証を完結させる構成は提供しません
委譲でユーザーを解決させると、委譲先から返った identity が provider_id 違いの別ユーザーとして新規作成されます。同一人物でも、委譲経由と直ログインで subject が変わります。
外部の認可サーバーへ委譲する場合は federation として妥当な動作ですが、テンプレートの既定構成としては提供しません。
導入時に決めること
1. 委譲先の認可サーバー
自テナント(テンプレートの既定)か、外部の認可サーバーか。外部にする場合は、その認可サーバーで CIBA が有効で、クライアントが登録済みである必要があります。
2. login_hint で誰を指すか
CIBA はユーザーを login_hint で特定します。サインイン画面で何を入力させるか(メールアドレス、電話番号、社員番号など)を決めます。
3. ポーリングの間隔と上限
サインイン画面がポーリングします。何秒おきに、何回まで待つかはフロント側の実装で決めます。
4. 承認手段
委譲先で何の認証を行うか(FIDO-UAF、パスワード、SMS など)。テンプレートでは FIDO-UAF です。
注意点
ポーリングは失敗として記録される
承認前のポーリングは authorization_pending(HTTP 400)を返し、これは認証の失敗として数えられます。
委譲のポリシーに failure_conditions を置くと、ポーリングしただけでトランザクションがロックします 。 テンプレートでは置いていません。
ポーリングを想定した仕組みではないところに乗せているため、ここだけ素直ではありません。
ポリシーの priority は大きい方が勝つ
既定のポリシーより大きい値にしないと、委譲のポリシーが適用されません。テンプレートでは 200 / 210 にしています。
承認する人が先に必要
委譲を試すには、承認する側のユーザーとデバイスが登録済みである必要があります。誰も承認できないと完了しません。
セットアップ
./config/templates/use-cases/ciba-delegation/setup.sh
動作確認の手順は VERIFY.md にあります。
| フェーズ | 内容 |
|---|---|
| Phase 1 | ユーザー登録 + FIDO-UAF デバイス登録(委譲の前提) |
| Phase 2 | CIBA 単体の動作確認 |
| Phase 3 | パスワード認証 + CIBA 委譲 |
他のテンプレートとの違い
| 項目 | CIBA | CIBA 委譲(これ) |
|---|---|---|
| 開始点 | クライアントのバックエンド | ブラウザの認可リクエスト |
| クライアント側の実装 | CIBA のトークンポーリング | 通常の認可コードフロー |
| サインイン画面 | 不要 | 必要(ポーリングする) |
| 用途 | サーバー起点の承認 | PCでのログインをスマホ承 認だけで完結させる |
CIBA そのものを使いたい場合は Quickstart: CIBA を参照してください。