認可リクエスト検証フロー詳細
認可エンドポイントにおけるリクエスト検証の全体像を記述する。
全体フロー概要
HTTP Request
↓
[1] OAuthRequestHandler.handleRequest()
↓
[2] OAuthRequestParameters.analyzePattern()
→ NORMAL | REQUEST_OBJECT | REQUEST_URI | PUSHED_REQUEST_URI
↓
[3] ContextCreator.create()
├─ JOSE解析 (Request Object/URIパターンのみ)
├─ filterScopes() → スコープ抽出
└─ analyze() → プロファイル決定
↓
[4] OAuthRequestVerifier.verify()
├─ [4a] baseVerifier.verify() ← プロファイル別
└─ [4b] extensionVerifiers.forEach(verify()) ← 共通拡張
↓
[5] OAuthRequestErrorHandler (エラー時)
├─ OAuthBadRequestException → エラーページ表示
└─ OAuthRedirectableBadRequestException → redirect_uriへリダイレクト
1. リクエストパターン決定
ファイル: libs/idp-server-core/.../oauth/request/OAuthRequestParameters.java
リクエストパラメータから以下の優先順位でパターンを決定:
| 優先度 | 条件 | パターン |
|---|---|---|
| 1 | requestパラメータあり | REQUEST_OBJECT |
| 2 | request_uriがPAR形式 | PUSHED_REQUEST_URI |
| 3 | request_uriあり | REQUEST_URI |
| 4 | 上記以外 | NORMAL |
2. コンテキスト作成
ファイル: libs/idp-server-core/.../oauth/context/OAuthRequestContextCreators.java
パターンごとに異なるCreatorが使用される:
| パターン | Creator | JOSE処理 |
|---|---|---|
NORMAL | NormalPatternContextCreator | なし(空JoseContext) |
REQUEST_OBJECT | RequestObjectPatternContextCreator | JWT解析・署名検証 |
REQUEST_URI | RequestUriPatternContextCreator | URIからJWT取得・解析・署名検証 |
PUSHED_REQUEST_URI | PushedRequestUriPatternContextCreator | リポジトリから取得(JOSE不要) |
2.1 Request Objectパターンの処理フロー
ファイル: libs/idp-server-core/.../oauth/context/RequestObjectPatternContextCreator.java
JoseHandler.handle(request_jwt, clientJwks, serverJwks, secret)
↓
JoseType.parse(jwt_header)
├─ alg: "none" → JoseType.plain → JwtContextCreator → 空JsonWebSignature
├─ alg: JWS系 → JoseType.signature → JwsContextCreator → 署名検証可能
└─ alg: JWE系 → JoseType.encryption → JweContextCreator → 復号処理
↓
joseContext.verifySignature()
├─ hasJsonWebSignature() == true → 署名検証実行
└─ hasJsonWebSignature() == false → no-op (alg:none)
↓
RequestObjectValidator.validate(claims)
↓
filterScopes() → analyze() → AuthorizationProfile決定
重要: alg: noneの場合、verifySignature()はno-opとなり、isUnsignedRequestObject()がtrueを返す。FAPI AdvancedではFapiAdvanceVerifierがこれを検出して拒否する。