Authentication Policy設定ガイド
このドキュメントの目的
認証ポリシー(Authentication Policy)の設定方法を理解します。
所要時間
⏱️ 約25分
Authentication Policyとは
認証ポリシーはフロー別の認証要件を定義します。
設定内容:
- 利用可能な認証方式
- ACR(Authentication Context Class Reference)マッピング
- 成功条件・失敗条件・ロック条件
設定ファイル構造
authentication-policy/oauth.json
{
"id": "f0864ea0-c4a0-470f-af92-22f995c80b3a",
"flow": "oauth",
"enabled": true,
"policies": [
{
"description": "default",
"priority": 1,
"conditions": {},
"available_methods": [
"password",
"email",
"fido-uaf"
],
"acr_mapping_rules": {
"urn:mace:incommon:iap:gold": ["fido-uaf", "fido2"],
"urn:mace:incommon:iap:silver": ["email", "sms"],
"urn:mace:incommon:iap:bronze": ["password"]
},
"success_conditions": {
"any_of": [
[
{
"path": "$.password-authentication.success_count",
"type": "integer",
"operation": "gte",
"value": 1
}
]
]
},
"failure_conditions": {
"any_of": []
},
"lock_conditions": {
"any_of": []
}
}
]
}
主要なフィールド
ポリシー基本情報
| フィールド | 必須 | 説明 | 例 |
|---|---|---|---|
id | ✅ | ポリシーID(UUID) | f0864ea0-... |
flow | ✅ | 対象フロー | oauth / ciba |
enabled | ✅ | 有効/無効 | true / false |
policies | ✅ | ポリシーリスト | 配列 |
Policyオブジェクト
| フィールド | 必須 | 説明 |
|---|---|---|
description | ❌ | ポリシー説明 |
priority | ✅ | 優先度(高い値が優先) |
conditions | ❌ | 適用条件 |
available_methods | ✅ | UIに表示する認証方式(UIヒント) |
acr_mapping_rules | ❌ | ACRマッピング |
step_definitions | ❌ | 多段階認証のステップ定義 |
success_conditions | ✅ | 成功条件 |
failure_conditions | ❌ | 失敗条件 |
lock_conditions | ❌ | ロック条件 |
auth_session_binding_required | ❌ | セッションバインディング(デフォルト: true) |
custom_params_trusted_sources | ❌ | 条件式から読めるカスタムパラメータの出どころ(デフォ ルト: ["pushed", "request_object"])。$.request.* を参照 |
Available Methods
UIに表示する認証方式を指定します。この設定はUIヒントとして機能し、フロントエンドが認証画面で表示する認証方式を決定するために使用されます。
{
"available_methods": [
"password",
"email",
"fido-uaf",
"fido2"
]
}
重要:
- この設定はバックエンドでの認証方式の制限には使用されません
- 認証の成功条件は
success_conditionsで制御してください - Authentication Configuration で登録済みの認証方式のみ指定可能
ACR Mapping Rules
ACR値と認証方式のマッピング :
{
"acr_mapping_rules": {
"urn:mace:incommon:iap:gold": ["fido-uaf", "fido2"],
"urn:mace:incommon:iap:silver": ["email", "sms"],
"urn:mace:incommon:iap:bronze": ["password"]
}
}
動作:
- クライアントが
acr_values=urn:mace:incommon:iap:goldを要求 → FIDO-UAFまたはWebAuthn認証が必要
Success Conditions
認証成功の条件をJSONPathで定義:
{
"success_conditions": {
"any_of": [
[
{
"path": "$.password-authentication.success_count",
"type": "integer",
"operation": "gte",
"value": 1
}
],
[
{
"path": "$.email-authentication.success_count",
"type": "integer",
"operation": "gte",
"value": 1
},
{
"path": "$.fido-uaf-authentication.success_count",
"type": "integer",
"operation": "gte",
"value": 1
}
]
]
}
}
意味:
- パスワード認証成功 OR(Email認証成功 AND FIDO-UAF認証成功)
サポートされる演算子
| 演算子 | 説明 | 例 |
|---|---|---|
eq / ne | 等しい / 等しくない | status == "REGISTERED" |
gt / gte | より大きい / 以上 | success_count >= 1 |
lt / lte | より小さい / 以下 | failure_count <= 3 |
in / nin | リストに含まれる / 含まれない | status in ["REGISTERED","IDENTITY_VERIFIED"] |
contains | 配列・文字列が値を含む | roles contains "admin" |
exists / missing | 値が存在する / しない | email_verified exists |
regex | 正規表現マッチ | — |
value の代わりに value_path を書くと、右辺もコンテキストの path から読みます(eq / ne のみ)。
どちらかの値が無いとき、eq は false、ne は true になります(value の eq は両方 null で true になるのと違います)。
value と value_path の両方を書いた条件と、eq / ne 以外で value_path を使った条件は、管理 API が 400 を返します。
{ "path": "$.request.custom_params.member_no", "operation": "eq",
"value_path": "$.user.custom_properties.member_no" }
参照可能なコンテキスト
条件の path は次の名前空間を参照できます(success_conditions / failure_conditions / lock_conditions / device_registration_conditions 共通)。
| 名前空間 | 内容 | 例 |
|---|---|---|
$.<interaction-type>.* | 各認証方式のインタラクション結果 | $.password-authentication.success_count |
$.<interaction-type>.interactions.<interaction>.* | interaction ごとの内訳(external-api-authentication と attribute-verification のみ) | $.external-api-authentication.interactions.risk-check.success_count |
$.user.* | 認証対象ユーザーの属性 | $.user.status, $.user.roles |
$.request.custom_params.* | 認可リクエストのカスタムパラメータ(信頼する出どころのものだけ) | $.request.custom_params.member_no |
interactions.*(interaction ごとの内訳)
external-api-authentication は1つの設定に複数の interaction を持てますが、それらはすべて同じエンドポイントパスに届くため、$.external-api-authentication.success_count は全 interaction の合計です。
そのため合計だけで条 件を書くと、意図しない形で成立します。
// ❌ 3つの interaction を通したいが、1つを3回呼んでも成立する
{ "path": "$.external-api-authentication.success_count", "operation": "gte", "value": 3 }
interaction ごとの内訳を使えば、それぞれを名指しで要求できます。
// ✅ 3つの interaction がそれぞれ1回以上成功したことを要求する
"success_conditions": {
"any_of": [[
{ "path": "$.external-api-authentication.interactions.step-a.success_count",
"type": "integer", "operation": "gte", "value": 1 },
{ "path": "$.external-api-authentication.interactions.step-b.success_count",
"type": "integer", "operation": "gte", "value": 1 },
{ "path": "$.external-api-authentication.interactions.step-c.success_count",
"type": "integer", "operation": "gte", "value": 1 }
]]
}
failure_count / call_count も同じ形で参照でき、interaction ごとに試行回数の上限を変えられます。
| path | 内容 |
|---|---|
$.external-api-authentication.success_count | 全 interaction の合計(従来どおり) |
$.external-api-authentication.interactions.<interaction>.success_count | その interaction だけの成功回数 |
$.external-api-authentication.interactions.<interaction>.failure_count | その interaction だけの失敗回数 |
$.external-api-authentication.interactions.<interaction>.call_count | その interaction の呼び出し回数 |
一度も呼ばれていない interaction はキー自体が存在せず、path が解決しません。解決しない path は null として扱われ、gte などの数値比較は false になります(#1646)。「必須の interaction が実行されていない」は条件を満たさない側に倒れます。
external-api-authentication だけです他の認証方式は「1つの interactor = 1つの認証要素」で、type そのものが数えたい対象と一致するため、内訳は作られません(interactions キーが出力されません)。
$.user.*(ユーザー属性)
認証トランザクションで識別済みのユーザー属性を参照できます(1st factor 完了後に有効)。
| path | 型 | 説明 |
|---|---|---|
$.user.sub | string | ユーザー識別子 |
$.user.status | string | ステータス(REGISTERED / IDENTITY_VERIFIED / LOCKED 等。複数許可は in で列挙) |
$.user.email_verified | boolean | メール検証済みか |
$.user.phone_number_verified | boolean | 電話番号検証済みか |
$.user.has_password | boolean | パスワード設定済みか |
$.user.provider_id | string | プロバイダID |
$.user.roles | string[] | ロール名の配列(contains で判定) |
$.user.permissions | string[] | パーミッションの配列(contains で判定) |
$.user.custom_properties.* | any | テナント定 義のカスタム属性 |
セキュリティ:
$.user.*は allowリスト方式で上記のみ参照可能です。hashed_password/credentials/verified_claimsなどの機微情報は意図的に除外しています(条件評価は値の有無が成否として観測できるため、機微情報を参照可能にすると値抽出のオラクルになりうる)。この投影はポリシー評価専用で、外部APIリクエストには使用されません。
設定例: 登録済みユーザーのみ成功とみなす
{
"success_conditions": {
"any_of": [
[
{ "path": "$.user.status", "operation": "in", "value": ["REGISTERED", "IDENTITY_VERIFIED"] },
{ "path": "$.password-authentication.success_count", "type": "integer", "operation": "gte", "value": 1 }
]
]
}
}