Token Endpoint実装ガイド
このドキュメントの目的
トークンエンドポイント(トークン発行・検証・失効)の実装を理解することが目標です。
所要時間
⏱️ 約30分
前提知識
- 02. Authorization Flow
- OAuth 2.0基礎知識
Token Endpointとは
OAuth 2.0のトークンエンドポイント(Token Endpoint) は、トークンに関する3つの機能を提供します:
- Token Request: トークン発行(RFC 6749 Section 3.2)
- Token Introspection: トークン検証(RFC 7662)
- Token Revocation: トークン失効(RFC 7009)
RFC準拠: OAuth 2.0 (RFC 6749), Token Introspection (RFC 7662), Token Revocation (RFC 7009)
エンドポイント一覧
# トークン発行(RFC 6749)
POST /{tenant-id}/v1/tokens
# トークンイントロスペクション(RFC 7662)
POST /{tenant-id}/v1/tokens/introspection
# トークン失効(RFC 7009)
POST /{tenant-id}/v1/tokens/revocation
実装: TokenV1Api.java
実装アーキテクチャ全体像
30秒で理解する全体像
HTTPリクエスト
↓
Controller (TokenV1Api) - HTTP処理
↓
EntryService (TokenEntryService) - トランザクション管理
↓
Core層 (TokenProtocol → TokenRequestHandler)
├─ Validator: 入力形式チェック
├─ クライアント認証(5種類)
├─ Grant Type別Service選択(4種類+拡張)
└─ トークン発行
↓
Repository - データ永続化
主要クラスの責務
| クラス | 役割 | 主な処理 |
|---|---|---|
| TokenV1Api | HTTPエンドポイント | パラメータ受け取り、レスポンス返却 |
| TokenEntryService | オーケストレーション | トランザクション、イベント発行 |
| TokenRequestHandler | トークン発行処理 | Validator、クライアント認証、Service選択 |
| ClientAuthenticationHandler | クライアント認証 | 5種類の認証方式から選択・実行 |
| OAuthTokenCreationServices | Grant Type振り分け | 4種類+拡張からService選択 |
主要ドメインオブジェクト
| オブジェクト | 説明 | 保存場所 | 有効期限 |
|---|---|---|---|
| OAuthToken | Access Token/Refresh Token | DB | 設定による(デフォルト1時間) |
| AuthorizationCodeGrant | Authorization Code | Redis + DB | 5分(使用後即無効) |
| ClientCredentials | クライアント認証情報 | - | - |
1. Token Request(トークン発行)
トークンエンドポイントの最も重要な機能はトークン発行です。Authorization Codeやクライアント認証情報を使ってAccess Token/Refresh Token/ID Tokenを発行します。
1.1 処理フロー全体
実装: TokenRequestHandler.java:82-120
POST /{tenant-id}/v1/tokens
↓
TokenRequestHandler.handle()
↓
┌────────────────────────────────────────┐
│ 1. Validator(入力形式チェック) │
│ - grant_type必須 │
│ - パラメータ形式チェック │
└────────────────────────────────────────┘
↓
┌────────────────────────────────────────┐
│ 2. 設定取得 │
│ - AuthorizationServerConfiguration │
│ - ClientConfiguration │
└────────────────────────────────────────┘
↓
┌────────────────────────────────────────┐
│ 3. クライアント認証 │
│ → ClientAuthenticationHandler │
│ └─ 5種類から選択・実行 │
└────────────────────────────────────────┘
↓
┌─────────────────────── ─────────────────┐
│ 4. Grant Type別Service選択 │
│ → OAuthTokenCreationServices │
│ └─ 4種類+拡張から選択 │
└────────────────────────────────────────┘
↓
┌────────────────────────────────────────┐
│ 5. トークン発行 │
│ → Service.create() │
│ ├─ Authorization Code検証 │
│ ├─ Access Token生成 │
│ ├─ Refresh Token生成 │
│ ├─ ID Token生成(OIDC) │
│ └─ DB保存 │
└────────────────────────────────────────┘
↓
TokenRequestResponse
1.2 クライアント認証(Client Authentication)
詳細: 10. Client Authentication実装 - 7つの認証方式の完全ガイド
標準5種類 + FAPI拡張2種類
実装: ClientAuthenticators.java:32-40
標準認証方式(5種類)
| 認証方式 | 送信方法 | 用途 | セキュリティレベル |
|---|---|---|---|
| client_secret_basic | Basic認証ヘッダー | 最も一般的 | ⭐⭐ |
| client_secret_post | POSTボディ | レガシー | ⭐ |
| client_secret_jwt | JWT署名(共有鍵) | 高セキュリティ | ⭐⭐⭐ |
| private_key_jwt | JWT署名(秘密鍵) | 最高セキュリティ | ⭐⭐⭐⭐ |
| none | 認証なし | パブリッククライアント(SPA/Mobile+PKCE) | - |
FAPI拡張認証方式(2種類)
実装: libs/idp-server-core-extension-fapi/src/main/java/org/idp/server/core/openid/extension/fapi/
| 認証方式 | 送信方法 | 用途 | セキュリティレベル |
|---|---|---|---|
| tls_client_auth | クライアント証明書(MTLS) | FAPI準拠・金融機関 | ⭐⭐⭐⭐⭐ |
| self_signed_tls_client_auth | 自己署名証明書(MTLS) | FAPI準拠・開発環境 | ⭐⭐⭐⭐ |
client_secret_basic の例
# Authorization ヘッダーにBase64エンコード
Authorization: Basic base64(client_id:client_secret)
# 実際のリクエスト
curl -X POST "http://localhost:8080/${TENANT_ID}/v1/tokens" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Basic $(echo -n 'my-client:my-secret' | base64)" \
-d "grant_type=authorization_code&code=${CODE}&redirect_uri=${REDIRECT_URI}"