ユースケース — マルチアカウントチューザ
prompt=select_account とは
OIDC Core 1.0 §3.1.2.1 では、RP が /authorize に prompt 要求パラメータを乗せられます。本ページに関係するのは次の 3 値:
prompt= | OP に依頼する内容 |
|---|---|
none | UI を一切出さない — 既存セッションを返すか失敗するか |
login | 既存セッションがあっても再ログインを強制 |
select_account | アカウント選択 UI を表示 — ユーザが続行するアカウントを選ぶ |
select_account は、大手 SaaS の「アカウント切り替え」ボタンの裏側で使われる仕様です。1 つのブラウザで同じ OP に複数アカウント(仕事 + 個人、alice + bob 等)でサインインしているとき、OP が一覧を出してユーザに選ばせます。
本ライブラリではこれをセッションマネージャの chooser group(同一ブラウザで同時に有効なセッション群)として実装し、追加・切替・全ログアウトの API を提供します。
このページで触れる仕様
- OpenID Connect Core 1.0 — §3.1.2.1(
promptパラメータ)、§3.1.2.4(同意との相互作用) - OpenID Connect Back-Channel Logout 1.0 — 「全員ログアウト」発火時の fan-out
用語の補足
promptパラメータ — RP が/authorizeに乗せて、OP に UI の出し方を指示するヒントです。none(UI を出さず、既存セッションを返すか失敗)、login(再ログイン強制)、consent(同意プロンプト強制)、select_account(アカウント選択 UI)の 4 種があり、空白区切りで複数指定できます。- Chooser group — 同一ブラウザで同時にサインイン中のセッション群。大手 SaaS では「アカウント切り替え」メニューとして表面化します。OP がサーバ側で group を保持し、cookie はブラウザを単一セッションではなく group に紐づけます。
sub(subject) — OP-RP ペアごとにスコープされる、ユーザの安定不透明識別子です。chooser でアカウントを切り替えると、次のid_tokenに乗るsubが変わります — 同じブラウザ、別の identity ということになります。
ソース:
examples/13-multi-accountは JSON ドライバで chooser を扱う例、examples/12-custom-chooser-uiは HTML テンプレート差し替え経路の例です。
動作
実装
prompt=select_account 用の interaction はビルトインです。アクティブな chooser group の全アカウントを並べた interaction.ChooserPromptData エンベロープを返します。同梱 HTML ドライバではビルトインテンプレートが一覧を描画し、ユーザは SessionID を POST で送り返します。サーバ描画の流れを保ちつつテンプレートだけ持ちたい場合は、op.WithChooserUI(op.ChooserUI{Template: tmpl}) を渡します。
JSON ドライバ(op.WithInteractionDriver(interaction.JSONDriver{}))では、SPA 側が同じ情報を JSON として受け取り、SessionID を POST で送り返します。op.WithSPAUI を使う場合、WithChooserUI が同時指定されていてもアカウント選択画面の描画は SPA が受け持ちます。このとき chooser テンプレートは使われず、op.New がその旨の警告を出します。
セッションマネージャの公開 API:
| メソッド | タイミング |
|---|---|
Sessions.Issue(ctx, subject) | 初回ログイン → 新 chooser group |
Sessions.AddAccount(ctx, group, subject) | 同ブラウザで 2 人目 → 既存 group に追加 |
Sessions.Switch(ctx, group, sessionID) | chooser でアカウントを選択 |
Sessions.LogoutAll(ctx, group) | 全員ログアウト |
続きはこちら
- カスタムアカウントチューザ UI — chooser をサーバ描画のまま保ち、アカウント選択テンプレートだけ差し替える。
- SPA / カスタム interaction — chooser を SPA から扱う。
- Back-Channel Logout — 全員ログアウト時の fan-out。