원클릭으로
test-oidf-conformance
OIDF適合性テストの実行・結果分析・不合格項目の修正ワークフローを行う際に使用。FAPI 1.0 Advanced/FAPI-CIBAのOIDF認定テスト結果の分析、GAP管理、修正パターンの適用に役立つ。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
OIDF適合性テストの実行・結果分析・不合格項目の修正ワークフローを行う際に使用。FAPI 1.0 Advanced/FAPI-CIBAのOIDF認定テスト結果の分析、GAP管理、修正パターンの適用に役立つ。
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 | test-oidf-conformance |
| description | OIDF適合性テストの実行・結果分析・不合格項目の修正ワークフローを行う際に使用。FAPI 1.0 Advanced/FAPI-CIBAのOIDF認定テスト結果の分析、GAP管理、修正パターンの適用に役立つ。 |
documentation/requirements/fapi-1.0-gap-analysis.yaml - GAP分析(テスト結果と修正記録)documentation/requirements/fapi-1.0-advanced-op-test-mapping.md - FAPI Advanced 63テストとRFC要件のマッピングconfig/examples/financial-grade/oidc-test/fapi-ciba/FAPI-CIBA-test-cases.md - FAPI-CIBAテストケース詳細config/examples/financial-grade/README.md - Financial-gradeテナントセットアップガイド関連スキル:
spec-fapi - FAPI仕様の実装方法・モジュール構成(実装時に参照)test-rfc-compliance - RFC要件抽出・Gap分析の一般的なワークフローOpenID Foundation (OIDF) が提供する適合性テストスイート (https://www.certification.openid.net/) の結果を分析し、不合格項目を修正するためのワークフロー。
| テストプラン | クライアント認証 | テスト数 | テスト設定ファイル |
|---|---|---|---|
| FAPI 1.0 Advanced Final | private_key_jwt | ~63 | config/examples/financial-grade/oidc-test/fapi/private_key_jwt.json |
| FAPI 1.0 Advanced Final | tls_client_auth | ~63 | config/examples/financial-grade/oidc-test/fapi/tls_client_auth.json |
| FAPI-CIBA ID1 | private_key_jwt + poll | ~30 | config/examples/financial-grade/oidc-test/fapi-ciba/private_key_jwt_poll.json |
| FAPI-CIBA ID1 | tls_client_auth + poll | ~30 | config/examples/financial-grade/oidc-test/fapi-ciba/tls_client_auth_poll.json |
OIDF Conformance Suite (https://www.certification.openid.net/)
↕ HTTPS (ngrok等でローカルを公開)
ローカル idp-server
├── api.local.test (通常エンドポイント - discoveryUrl)
└── mtls.api.local.test (mTLSエンドポイント - resourceUrl)
↕
Financial-gradeテナント (tenant_id: c3d4e5f6-a7b8-c9d0-e1f2-a3b4c5d6e7f8)
テスト名を documentation/requirements/fapi-1.0-advanced-op-test-mapping.md で検索し、対応するRFC/仕様条項を特定する。
FAPI Advanced テスト名パターン:
fapi1-advanced-final-{テスト識別子}
FAPI-CIBA テスト名パターン:
fapi-ciba-id1-{テスト識別子}
テスト識別子から修正対象のコードを絞り込む:
| テスト識別子パターン | 主な関連クラス | モジュール |
|---|---|---|
ensure-request-object-* | RequestObjectVerifier, RequestObjectVerifyable | idp-server-core |
ensure-matching-*, ensure-response-type-* | FapiAdvanceVerifier, FapiBaselineVerifier | idp-server-core-extension-fapi |
ensure-jarm-*, ensure-response-mode-* | JarmVerifier, AuthorizationResponseCreator, AuthorizationErrorResponseCreator | idp-server-core |
par-* | OAuthRequestHandler.handlePushedRequest(), PushedRequestUriPatternContextCreator | idp-server-core |
ensure-pkce-*, par-*-pkce-* | FapiAdvanceVerifier, FapiBaselineVerifier | idp-server-core-extension-fapi |
ensure-mtls-* | TlsClientAuthAuthenticator, SelfSignedTlsClientAuthAuthenticator | idp-server-core-extension-fapi |
ensure-client-assertion-* | ClientAuthenticationJwtValidatable | idp-server-core |
ensure-signed-*-with-RS256-* | アルゴリズム検証ロジック | idp-server-core-extension-fapi |
access-token-type-* | AuthorizationHeaderType | idp-server-core |
refresh-token | RefreshTokenGrantService, RefreshTokenVerifier | idp-server-core |
user-rejects-* | AuthorizationDenyHandler | idp-server-core |
FAPI-CIBA固有:
| テスト識別子パターン | 主な関連クラス | モジュール |
|---|---|---|
ensure-*-backchannel-* | CibaRequestHandler, FapiCibaVerifier | idp-server-core-extension-fapi-ciba |
ensure-request-object-* (CIBA) | CibaRequestObjectVerifier | idp-server-core-extension-ciba |
*-notification-endpoint-* | CibaPingNotificationService | idp-server-core-extension-ciba |
FAPI Advanced の認可リクエスト検証は以下のチェーンで実行される:
OAuthRequestVerifier
├── OAuthRequestBaseVerifier (共通検証)
│ ├── scope検証
│ ├── redirect_uri検証
│ └── response_type検証
│
├── Extension Verifier (プロファイル別)
│ ├── [FAPI_BASELINE] FapiBaselineVerifier
│ │ ├── response_type=code only
│ │ ├── PKCE S256必須
│ │ ├── state必須
│ │ └── nonce必須 (openid scope時)
│ │
│ ├── [FAPI_ADVANCE] FapiAdvanceVerifier
│ │ ├── FapiBaselineVerifier委譲 ← 重要: Baseline要件を継承
│ │ ├── PAR必須
│ │ ├── JARM必須
│ │ ├── Request Object署名検証
│ │ ├── exp/nbf 60分検証
│ │ ├── aud検証
│ │ ├── クライアント認証方式制限
│ │ └── PAR時PKCE S256検証
│ │
│ └── [FAPI_CIBA] FapiCibaVerifier
│
└── RequestObjectVerifier (Request Object固有)
├── JWT署名検証
├── exp/nbf/aud/iss検証
└── jti検証 (存在時のみ)
PAR経由のリクエストの場合:
./gradlew spotlessApply でフォーマット修正./gradlew build でコンパイル確認documentation/requirements/fapi-1.0-gap-analysis.yaml に追記:
- id: "GAP-XXX" # 次の連番
title: "簡潔なタイトル"
priority: "P0" # P0:適合性テスト不合格, P1:テスト不足, P2:改善
type: "bug" # bug / test / enhancement
category: "authorization_server" # authorization_server / resource_server / security_algorithms
spec_reference: "RFC/仕様のセクション番号"
requirement: |
仕様の要件文(原文英語が望ましい)
current_behavior: |
現在の動作と問題点
expected_behavior: |
期待される正しい動作
conformance_test_result: "FAILURE - テスト名と失敗理由"
fix_status: "FIXED" # OPEN / IN_PROGRESS / FIXED
fix_description: |
修正内容の詳細
affected_files:
- path: "修正ファイルのパス"
action: "modified"
detail: "修正内容"
e2e_test_needed: false # OIDF適合性テストで検証できる場合はfalse
e2e_test_description: "OIDF適合性テストで検証"
GAP番号の採番: fapi-1.0-gap-analysis.yaml の issue_candidates セクション末尾のGAP-XXXから次番号を使用。
□ ./gradlew spotlessApply 実行
□ ./gradlew build 成功
□ private_key_jwt テストプランで該当テスト合格
□ tls_client_auth テストプランで該当テスト合格
□ gap-analysis.yaml を更新(fix_status: FIXED)
□ 既存E2Eテストが壊れていないことを確認 (cd e2e && npm test)
□ コミットメッセージに GAP-XXX を含める
# 1. ローカル環境起動
docker compose up -d
# 2. financial-gradeテナント作成
cd config/examples/financial-grade
./setup.sh
# 3. ディスカバリエンドポイント確認
curl https://api.local.test/c3d4e5f6-a7b8-c9d0-e1f2-a3b4c5d6e7f8/.well-known/openid-configuration
# Docker imageを再ビルド(必須 - restartだけでは反映されない)
docker compose up -d --build idp-server-1 idp-server-2
https://www.certification.openid.net/ にアクセスconfig/examples/financial-grade/oidc-test/fapi/{private_key_jwt,tls_client_auth}.jsonconfig/examples/financial-grade/oidc-test/fapi-ciba/{private_key_jwt_poll,tls_client_auth_poll}.jsonCIBAテストではユーザーのデバイス認証承認が必要:
cd config/examples/financial-grade
./ciba-device-auth.sh
症状: FAPI Advanced固有の検証はあるが、Baseline由来の検証が漏れている
原因: FapiAdvanceVerifier が FapiBaselineVerifier への委譲呼び出しを忘れている
対処: FapiAdvanceVerifier.verify() の先頭で fapiBaselineVerifier.verify() を呼ぶ
実例: GAP-021(nonce/state検証の漏れ)
症状: テストスイートが期待するerrorコード(invalid_request, invalid_request_object等)と異なるエラーが返る
原因: エラーコードがRFC規定と一致していない、または検証の実行順序により想定と異なるverifierがエラーを返す
対処: 各RFCのエラーコード定義を確認し、適切なエラーコードで例外をスロー
実例: GAP-006(scopeなしRequest Objectでinvalid_scopeではなくinvalid_request_objectを返すべき)
症状: JARMレスポンスが期待通りに生成されない 原因A: エラー応答がJARMでラップされるべきでない場合にラップされている 原因B: JARM応答にstateクレームが欠落している 原因C: リダイレクトURIにクエリパラメータがある場合の区切り文字が不正 対処:
context.isJwtMode()(自動判定)ではなく context.responseMode().isJwtMode()(明示指定)を使用JarmResponseCreator でエラー時もstateを含める?がある場合は&で連結
実例: GAP-008(JARM不要なエラーがJARMラップ), GAP-021(stateクレーム欠落、クエリパラメータ区切り)症状: PAR経由のリクエストで検証が過剰 or 不足 原因: PARエンドポイントと認可エンドポイントで検証が重複/不足 対処: PARの2段階検証アーキテクチャを理解し、各段階で何を検証すべきか整理
症状: FAPI禁止のアルゴリズムが受け入れられてしまう
原因: アルゴリズム制限チェックがFAPIレイヤーで実装されていない
対処: FapiAdvanceVerifier でアルゴリズムチェックを追加(PS256/ES256のみ許可)
実例: GAP-007(alg:none受け入れ)
症状: 一方のテストプランでは合格するが他方で不合格
原因: クライアント認証方式によって異なるコードパスが実行される
対処: 必ず両方のテストプランで確認する。特にクライアント認証関連のVerifierは方式ごとに分岐がある
確認: ClientAuthenticationJwtValidatable (private_key_jwt), TlsClientAuthAuthenticator (tls_client_auth)
症状: 任意のクレームを必須として拒否している、または必須のクレームを検証していない 原因: FAPI 1.0 と FAPI 2.0 で要件が異なる場合がある(例: jtiはFAPI 1.0では任意、2.0では必須) 対処: 対象のFAPIバージョンの仕様を正確に確認し、クレーム検証ロジックを修正 実例: GAP-005(jtiクレームをFAPI 1.0で必須にしていた)
| # | テスト名 | RFC/仕様要件 |
|---|---|---|
| 2 | fapi1-advanced-final (happy path) | 5.2.2-5/6, 5.1, RFC8705-3 |
| 3 | user-rejects-authentication | RFC6749-4.1.2.1 |
| 9 | ensure-response-mode-query | 5.2.2-2 |
| 15 | ensure-request-object-without-exp-fails | 5.2.2-13 |
| 16 | ensure-request-object-without-nbf-fails | 5.2.2-17 |
| 19 | ensure-request-object-without-nonce-fails | Baseline 5.2.2.2 |
| 22 | ensure-request-object-with-bad-aud-fails | 5.2.2-15 |
| 25 | ensure-signed-request-object-with-RS256-fails | 8.6-1 |
| 26 | ensure-request-object-signature-algorithm-is-not-none | 8.6-3 |
| 31 | ensure-response-type-code-fails | 5.2.2-2 |
| 33 | ensure-mtls-holder-of-key-required | 5.2.2-5/6, RFC8705-2 |
| 34 | ensure-authorization-code-is-bound-to-client | RFC6749-4.1.3 |
| 42 | refresh-token | RFC8705-3 |
| 53-58 | par-* | RFC9126 |
| 59-62 | par-*-pkce-* / ensure-pkce-* | RFC7636, 5.2.2-18 |
完全なマッピングは documentation/requirements/fapi-1.0-advanced-op-test-mapping.md を参照。
fix: [簡潔な修正内容の説明] (GAP-XXX)
例:
fix: FAPI Advanced JARM/nonce/state適合性テスト不合格を修正 (GAP-021)
fix: PAR有効期限の分離とRequest Object署名検証エラーコードの修正 (GAP-020)
fix: FAPI 1.0 Advanced OIDF適合性テスト不合格項目を修正 (GAP-016〜GAP-019)
api.local.test と mtls.api.local.test の両方が公開されているか確認docker compose psクライアント設定を変更した場合、以下の同期が必要:
config/examples/financial-grade/ の各クライアントJSONconfig/examples/financial-grade/oidc-test/fapi/ のテスト設定JSONonboarding-request.json のクライアント定義ciba-device-auth.sh の実行タイミングが遅い可能性# restartではなく--buildが必須
docker compose up -d --build idp-server-1 idp-server-2