メインコンテンツまでスキップ

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 2CIBA 単体の動作確認
Phase 3パスワード認証 + CIBA 委譲

他のテンプレートとの違い

項目CIBACIBA 委譲(これ)
開始点クライアントのバックエンドブラウザの認可リクエスト
クライアント側の実装CIBA のトークンポーリング通常の認可コードフロー
サインイン画面不要必要(ポーリングする)
用途サーバー起点の承認PCでのログインをスマホ承認だけで完結させる

CIBA そのものを使いたい場合は Quickstart: CIBA を参照してください。


関連ドキュメント