원클릭으로
use-case-mfa-fido-uaf
MFA FIDO-UAF(パスワード + デバイス生体認証)ユースケースの設定ガイド。FIDO-UAFデバイス登録、Push通知、login_hint付き認可コードフロー、認証ステータスポーリングのヒアリングと設定JSONを提供。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
MFA FIDO-UAF(パスワード + デバイス生体認証)ユースケースの設定ガイド。FIDO-UAFデバイス登録、Push通知、login_hint付き認可コードフロー、認証ステータスポーリングのヒアリングと設定JSONを提供。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
UserInfoエンドポイント(UserInfo Endpoint)機能の開発・修正を行う際に使用。UserInfo claims、scopeフィルタリング、verified_claims実装時に役立つ。
外部API認証ユースケースの設定ガイド。外部API連携(認証委譲、リスク判定、OTP等)の interaction 設計、identity_match_field、MFA 2段階目、previous_interaction のヒアリングと設定JSONを提供。
ユースケース別セットアップのエントリポイント。ユーザーにユースケースを選択してもらい、対応するスキル(use-case-login, use-case-mfa等)にルーティングする。共通ワークフロー、前提条件、組み合わせパターンの概要を提供。
認証機能(Authentication Policy, MFA)の開発・修正を行う際に使用。認証ポリシー、パスワード、OTP、FIDO2、条件付き認証実装時に役立つ。
セキュリティ・脆弱性対策の開発・テストを行う際に使用。OAuth/OIDC攻撃対策、認証識別子切り替え攻撃、Session Fixation、マルチテナント分離、セキュリティテスト実装時に役立つ。
外部サービス連携(External Service Integration)機能の開発・修正を行う際に使用。HTTP Request Executor, MappingRule, OAuth/HMAC認証実装時に役立つ。
| name | use-case-mfa-fido-uaf |
| description | MFA FIDO-UAF(パスワード + デバイス生体認証)ユースケースの設定ガイド。FIDO-UAFデバイス登録、Push通知、login_hint付き認可コードフロー、認証ステータスポーリングのヒアリングと設定JSONを提供。 |
| # | 決めること | 選択肢 | 影響する設定 |
|---|---|---|---|
| 1 | FIDO-UAFサーバーURL | URL(デフォルト: http://host.docker.internal:4000) | authentication-config-fido-uaf.json |
| 2 | デバイスシークレットアルゴリズム | HS256(デフォルト)/ HS384 / HS512 | authentication_device_rule.device_secret_algorithm |
| 3 | 最大デバイス数 | 数値(デフォルト: 5) | authentication_device_rule.max_devices |
| 4 | Push通知サービス | FCM(デフォルト)/ APNS | authentication-config-device-notification.json |
| 5 | パスワードポリシー | 最小文字数、文字種制約 | テナント password_policy |
| 6 | アカウントロック閾値 | 回数(デフォルト: 5) | 認証ポリシー lock_conditions |
| ヒアリング項目 | 環境変数 | デフォルト値 |
|---|---|---|
| FIDO-UAFサーバーURL | FIDO_UAF_SERVER_URL | http://host.docker.internal:4000 |
| デバイスシークレットアルゴリズム | DEVICE_SECRET_ALGORITHM | HS256 |
| デバイスシークレット有効期限 | DEVICE_SECRET_EXPIRES_IN | 31536000 |
| 最大デバイス数 | MAX_DEVICES | 5 |
| 環境変数 | デフォルト値 | 説明 |
|---|---|---|
ORGANIZATION_NAME | mfa-fido-uaf | 組織名 |
SESSION_TIMEOUT_SECONDS | 86400 | セッション有効期限 |
PASSWORD_MIN_LENGTH | 8 | パスワード最小文字数 |
ACCESS_TOKEN_DURATION | 3600 | AT有効期限 |
ID_TOKEN_DURATION | 3600 | IDT有効期限 |
REFRESH_TOKEN_DURATION | 86400 | RT有効期限 |
認可サーバーに以下の設定が含まれること:
{
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:jwt-bearer"
],
"scopes_supported": [
"openid", "profile", "email",
"claims:authentication_devices"
],
"extension": {
"custom_claims_scope_mapping": true
}
}
テナントに authentication_device_rule が含まれること:
{
"identity_policy_config": {
"authentication_device_rule": {
"max_devices": 5,
"required_identity_verification": false,
"authentication_type": "device_secret_jwt",
"issue_device_secret": true,
"device_secret_algorithm": "HS256",
"device_secret_expires_in_seconds": 31536000
}
}
}
FIDO-UAFサーバーに接続する認証設定:
{
"type": "fido-uaf",
"interactions": {
"fido-uaf-registration-challenge": { "...registration challenge..." },
"fido-uaf-registration": { "...registration complete..." },
"fido-uaf-authentication-challenge": { "...authentication challenge..." },
"fido-uaf-authentication": { "...authentication complete..." }
}
}
{
"type": "authentication-device-notification",
"interactions": {
"authentication-device-notification": {
"execution": {
"function": "fcm_notification",
"notification_template": {
"title": "認証リクエスト",
"body": "アプリを開いて認証してください"
}
}
}
}
}
{
"grant_types": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:jwt-bearer"
],
"scope": "openid profile email claims:authentication_devices",
"extension": {
"available_federations": [{
"issuer": "device",
"type": "device",
"subject_claim_mapping": "sub",
"jwt_bearer_grant_enabled": true
}]
}
}
priority: 10conditions.acr_values: ["urn:idp:acr:device"]available_methods: authentication-device-notification, authentication-device-deny, fido-uafpriority: 1conditions: {}(無条件)available_methods: password, email, initial-registration, fido-uaf認可リクエスト(login_hint=sub:{userId}, acr_values=urn:idp:acr:device)
→ User 事前解決 + AuthenticationDevice セット
→ SPA: デバイス通知送信(オプション)
→ Device: Push通知受信 or ポーリングで認証検知
→ Device: FIDO-UAF 生体認証
→ SPA: authentication-status ポーリング → success
→ authorize → トークン発行
認可リクエスト(login_hintなし)
→ SPA: パスワード認証
→ authorize → トークン発行
認可リクエスト(login_hintなし)
→ パスワード認証(1st factor)
→ デバイス通知(2nd factor)
→ FIDO-UAF認証
→ authentication-status: success
→ authorize → トークン発行
デバイスへのPush通知送信(authentication-device-notification)は、AuthenticationTransactionにユーザーが解決されていることを前提としている。login_hintなしでは通知APIが "User does not exist" エラーとなり、フローが成立しない。
この仕様はPush通知疲労攻撃(Push Notification Fatigue Attack)を防ぐ意図も含んでいる。ログイン画面でメールアドレス等を入力するだけでPush通知を送信できてしまうと、攻撃者が大量通知によりユーザーの誤承認を誘発できるため。
Push通知を受け取れない環境(通知オフ等)でも、デバイスが自発的に認証トランザクションをポーリングすることでフローは成立する。
| # | 確認観点 | 設定箇所 | よくあるミス |
|---|---|---|---|
| 1 | claims_supported が設定済み | 認可サーバー | 未設定で UserInfo/ID Token が sub のみ |
| 2 | grant_types_supported に urn:ietf:params:oauth:grant-type:jwt-bearer が含まれる | 認可サーバー | JWT Bearer Grant 未追加でデバイス認証不可 |
| 3 | クライアントの grant_types に JWT Bearer が含まれる | クライアント | 認可サーバーに追加してもクライアントに設定し忘れ |
| 4 | authentication_device_rule が設定済み | テナント identity_policy_config | 未設定だとデバイス登録・device_secret 発行不可 |
| 5 | issue_device_secret: true が設定済み | テナント authentication_device_rule | false だと device_secret が発行されない |
| 6 | FIDO-UAF認証設定が作成済み | 認証設定 | 未作成だと FIDO-UAF 登録・認証不可 |
| 7 | デバイス通知設定が作成済み | 認証設定 | 未作成でPush通知送信不可 |
| 8 | クライアントに available_federations (device) が設定済み | クライアント extension | 未設定だと device_secret_jwt 認証不可 |
| 9 | scopes_supported に claims:authentication_devices が含まれる | 認可サーバー | 未設定だとデバイス情報がスコープに含まれない |
| 10 | custom_claims_scope_mapping: true が設定済み | 認可サーバー extension | 未設定だと claims:* スコープが機能しない |
| 11 | ui_config.base_url が認証UIのオリジン | テナント ui_config | APIサーバーURLを設定してしまう |
| 12 | 認証ポリシーに device_fido_uaf_authentication(priority高)と password_fallback(priority低)の2つ | 認証ポリシー | ポリシー1つだけで login_hint 付きフローが動かない |
| テスト | prompt値 | 目的 |
|---|---|---|
| ユーザー登録 | prompt=create | Sign Up画面を直接表示 |
| 再認証 | prompt=login | 既存セッションを無視して再認証を強制 |
config/templates/use-cases/mfa-fido-uaf/config/templates/use-cases/mfa-fido-uaf/authentication-config-fido-uaf.jsonconfig/templates/use-cases/mfa-fido-uaf/authentication-config-device-notification.jsonconfig/templates/use-cases/mfa-fido-uaf/authentication-policy.jsonconfig/templates/use-cases/mfa-fido-uaf/verify.shdocumentation/docs/content_05_how-to/phase-3-advanced/fido-uaf/04-authorization-code-flow.mddocumentation/docs/content_05_how-to/phase-3-advanced/fido-uaf/02-registration.mddocumentation/docs/content_05_how-to/phase-3-advanced/fido-uaf/01-ciba-flow.mddocumentation/docs/content_02_quickstart/quickstart-14-mfa-fido-uaf.md$ARGUMENTS