セルフサービス 連絡先の確認・変更
認証済みエンドユーザーが自分のメールアドレスまたは電話番号を、確認(検証)または変更するフロー。 対象の値へ確認コードを送り、本人到達性を検証してから確定する。
送信には既存の認証設定をそのまま流用する(Email は Email認証 の
email-authentication-challenge、電話番号は SMS認証 の sms-authentication-challenge)。
テナントが追加で書く設定は、変 更用スコープと(必要なら)変更ポリシーだけ。
- なぜ識別子移動と属性更新を分けるのか → 連絡先変更ポリシー
- フローとエンドポイント → セルフサービス 連絡先の確認・変更(プロトコル)
どの実装が動くかは execution.function が決める
流用する認証設定には形が2つあり、どちらも動く。どちらになるかは execution.function の値で
決まる。ログイン側の AuthenticationExecutors と同じ仕組みで、モードを 指定する設定項目は無いし、
設定の形から推測もしない。
execution.function | 動く実装 | コードを持つのは |
|---|---|---|
email_authentication_challenge | ローカル生成・送信(details の sender を使う) | idp-server |
sms_authentication_challenge | 同上 | idp-server |
http_request | 外部サービスへ単発で委譲 | 外部サービス |
http_requests | 外部サービスへチェーンで委譲 | 外部サービス |
email_authentication / sms_authentication | チャレンジ行の verification_code と照合 | idp-server |
| 上記以外 | (実装が無い) | — |
実装が無い function は設定エラーとして報告される。以前は sender の記述が無いことから
「委譲だろう」と推測していたため、no_action のような別の設定形で 500 になっていた。
| ローカル生成 | 外部委譲 | |
|---|---|---|
| コード生成・送信 | idp-server(SMTP / HTTP API / AWS SES など) | 外部サービス |
| 照合 | idp-server(verification_code 列と比較) | 外部の検証API |
| idp-server が保持するもの | コードそのもの | 外部の識別子(transaction_id 等) |
| 参照する設定 | details(sender / settings / templates) | http_request / http_requests と *_store |
イン タラクションの必須・任意
| インタラクション | 必須 | 無い場合 |
|---|---|---|
{channel}-authentication-challenge | 必須 | 設定エラー。送信手段が無いため安全な既定が無い |
{channel}-authentication | 任意 | チャレンジ行との照合にフォールバックする |
送信だけを設定したテナント(verify 側を書いていない)でも、ローカル生成なら動く。委譲のチャレンジが このフォールバックに来た場合は、行にコードが無いので必ず失敗する(fail closed)。
idp-server が組み立てるリクエストボディ
委譲時、idp-server は次のボディを $.request_body として渡す。実際に外部へ送る形は
テナントの body_mapping_rules が決める({"from": "$.request_body", "to": "*"} なら素通し)。
// {channel}-authentication-challenge
{ "email": "new@example.com", "template": "email_change", "operation": "email_change" }
{ "phone_number": "+819011112222", "template": "phone_change", "operation": "phone_change" }
// {channel}-authentication
{ "verification_code": "123456", "operation": "email_change" }
宛先の項目名は各チャネルの request.schema と同じ email / phone_number。ログイン側の
チャレンジと同じ名前なので、既存の外部サービス設定をそのまま向けられる。
マッピングで読める値もログイン側と同じ。
| パス | 内容 |
|---|---|
$.request_body | 上記のボディ |
$.request_attributes | IPアドレス・User-Agent など |
$.user | 認証済みユーザーの許可リスト射影(sub / provider_id / external_user_id / email / phone_number / 名前 / roles / custom_properties。External API認証 と共通) |
$.interaction | challenge で保持した値(previous_interaction を書いた場合) |
$.execution_http_requests | チェーン中の各結果(チェーンのみ) |
外部委譲で参照する設定
challenge 側({channel}-authentication-challenge):
| 項目 | 用途 |
|---|---|
execution.http_request | 外部API設定(単発) |
execution.http_requests | 外部API設定(チェーン。認証してから送るなど) |
execution.http_request_store / http_requests_store | レスポンスから何を保持するか。入力は $.response_body.* / $.status_code / $.response_headers |
verify 側({channel}-authentication):
| 項目 | 用途 |
|---|---|
execution.http_request / http_requests |