UserInfo実装ガイド
このドキュメントの目的
UserInfoエンドポイント(ユーザー情報取得)の実装を理解することが目標です。
所要時間
⏱️ 約20分
前提知識
- 03. Token Flow
- OpenID Connect基礎知識
UserInfoとは
Access Tokenを使ってユーザー情報を取得するエンドポイント
OpenID Connect Core 1.0 Section 5.3準拠
アーキテクチャ全体像
30秒で理解する全体像
HTTPリクエスト(Access Token + DPoP Proof)
↓
Controller (UserinfoV1Api) - HTTP処理
├─ Authorization, x-ssl-cert, DPoP ヘッダー受け取り
↓
EntryService (UserinfoEntryService) - オーケストレーション
├─ Tenant取得
├─ UserinfoRequest作成(clientCert, dpopProof, httpMethod, httpUri)
├─ UserinfoProtocol.request()(Delegate渡し)
└─ イベント発行
↓
Core層 (UserinfoHandler)
├─ Access Token検証(署名・期限・失効チェック)
├─ Subject存在チェック
├─ Delegate.findUser() 呼び出し
├─ Sender-Constrained Token検証(MTLS/DPoP)
├─ Scope別Claims抽出
└─ レスポンス生成
↓
UseCase層 (UserinfoDelegate.findUser())
└─ UserQueryRepository.get()
↓
ユーザー情報返却
主要クラスの責務
| クラス | 層 | 役割 | 実装 |
|---|---|---|---|
| UserinfoV1Api | Controller | HTTPエンドポイント | UserinfoV1Api.java |
| UserinfoEntryService | UseCase | トランザクション・Delegate実装 | UserinfoEntryService.java:62-114 |
| UserinfoProtocol | Core | Access Token検証・Claims抽出 | Core |
| UserinfoDelegate | Interface | Core層→UseCase層コールバック | Core |
| OAuthToken | Core | Access Token情報(subject/scope) | Core Domain |
Delegateパターン
重要: Core層はRepositoryに直接依存しない設計
Core層 (UserinfoProtocol)
↓ Delegate経由
UseCase層 (UserinfoEntryService.findUser())
↓
Repository層 (UserQueryRepository)
理由: Hexagonal Architectureの原則(Core層の独立性維持)
エンドポイント
# Bearerトークンの場合
GET /{tenant-id}/v1/userinfo
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
# DPoP-boundトークンの場合(RFC 9449)
GET /{tenant-id}/v1/userinfo
Authorization: DPoP eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
DPoP: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3Arand0IiwiandrIjp7...
実装: