使い方 — マルチアカウント選択
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 が一覧を出してユーザに選ばせます。
本ライブラリではこれを OP 内部のセッションマネージャが持つ chooser group(同一ブラウザで同時に有効なセッション群)として実装し、追加・切替・全ログアウトを内部で処理します。
このページで触れる仕様
- OpenID Connect Core 1.0 — §3.1.2.1(
promptパラメータ)、§3.1.2.4(同意との相互作用) - OpenID Connect Back-Channel Logout 1.0 — 「全員ログアウト」発火時の 一斉通知
用語の補足
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 は組み込みです。アクティブなアカウント選択グループの全アカウントを並べた 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 がその旨の警告を出します。
これは OP 内部のセッションマネージャ(internal/sessions.Manager)が行う処理です。internal/ 配下の非公開型のため、組み込み側が import して直接呼び出すことはできません。
| 内部処理 | タイミング |
|---|---|
| 新規 chooser group の発行 | 初回ログイン → 新 chooser group |
| group へのアカウント追加 | 同ブラウザで 2 人目 → 既存 group に追加 |
| group 内のアクティブセッション切替 | chooser でアカウントを選択 |
| group 全体のログアウト | 全員ログアウト |
組み込み側から触れられるセッション状態の公開面は store.SessionStore インターフェース(Save / Find / Touch / Delete / ListByChooserGroup)で、カスタムストアバックエンドはこれを実装します。chooser の一連処理そのものは /authorize と chooser interaction の処理の中で OP が内部的に行うものであり、アプリケーションコードから呼び出す API ではありません。
続きはこちら
- カスタムアカウント選択 UI — chooser をサーバ描画のまま保ち、アカウント選択テンプレートだけ差し替える。
- SPA / 対話画面のカスタマイズ — アカウント選択を SPA から扱う。
- Back-Channel Logout — 全員ログアウト時の 一斉通知。