원클릭으로
spec-grant
Grant管理(Grant Management)機能の開発・修正を行う際に使用。AuthorizationGrant、ConsentClaims、同意管理、Grant管理API実装時に役立つ。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Grant管理(Grant Management)機能の開発・修正を行う際に使用。AuthorizationGrant、ConsentClaims、同意管理、Grant管理API実装時に役立つ。
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 | spec-grant |
| description | Grant管理(Grant Management)機能の開発・修正を行う際に使用。AuthorizationGrant、ConsentClaims、同意管理、Grant管理API実装時に役立つ。 |
documentation/docs/content_03_concepts/03-authentication-authorization/concept-05-grant-management.md - Grant管理概念documentation/openapi/swagger-cp-grant-management-ja.yaml - Grant管理API仕様(OpenAPI)Grant管理は、認可コンテキストを管理する層。
libs/
├── idp-server-core/ # Grantコア
│ └── .../grant_management/
│ ├── AuthorizationGranted.java # 永続化Grant(created_at/updated_at含む)
│ ├── AuthorizationGrantedIdentifier.java
│ ├── AuthorizationGrantedQueries.java # クエリパラメータ(limit上限1000)
│ ├── AuthorizationGrantedRepository.java
│ ├── AuthorizationGrantedQueryRepository.java
│ ├── grant/
│ │ ├── AuthorizationGrant.java # 認可Grant
│ │ ├── GrantIdTokenClaims.java
│ │ └── GrantUserinfoClaims.java
│ └── consent/
│ └── ConsentClaims.java # 同意情報
│
├── idp-server-core-adapter/ # DB実装
│ └── .../grant_management/
│ ├── AuthorizationGrantedDataSource.java
│ ├── AuthorizationGrantedQueryDataSource.java
│ ├── ModelConverter.java # DB→モデル変換
│ ├── PostgresqlExecutor.java
│ └── MysqlExecutor.java
│
├── idp-server-control-plane/ # Grant管理API定義
│ └── .../management/oidc/grant/
│ ├── OrgGrantManagementApi.java # APIインターフェース
│ ├── GrantManagementContext.java
│ ├── GrantManagementContextBuilder.java
│ ├── handler/
│ │ ├── OrgGrantManagementHandler.java
│ │ ├── GrantManagementService.java
│ │ ├── GrantFindListService.java
│ │ ├── GrantFindService.java
│ │ └── GrantRevocationService.java # Grant取り消し+トークン削除
│ └── io/
│ ├── GrantManagementRequest.java
│ ├── GrantManagementResponse.java
│ ├── GrantManagementResult.java
│ └── GrantManagementStatus.java
│
├── idp-server-use-cases/ # EntryService
│ └── .../control_plane/organization_manager/
│ └── OrgGrantManagementEntryService.java
│
└── idp-server-springboot-adapter/ # REST API
└── .../control_plane/restapi/organization/
└── OrganizationGrantManagementV1Api.java
| メソッド | パス | 説明 | 権限 |
|---|---|---|---|
| GET | /v1/management/organizations/{org-id}/tenants/{tenant-id}/grants | Grant一覧取得 | GRANT_READ |
| GET | /v1/management/organizations/{org-id}/tenants/{tenant-id}/grants/{grant-id} | Grant詳細取得 | GRANT_READ |
| DELETE | /v1/management/organizations/{org-id}/tenants/{tenant-id}/grants/{grant-id} | Grant取り消し | GRANT_DELETE |
| パラメータ | 説明 |
|---|---|
user_id | ユーザーIDでフィルタ |
client_id | クライアントIDでフィルタ |
from | 作成日時の開始範囲(ISO 8601) |
to | 作成日時の終了範囲(ISO 8601) |
limit | 最大件数(デフォルト20、上限1000) |
offset | スキップ件数 |
DELETE時に ?dry_run=true を指定すると、実際の削除を行わずシミュレーション結果を返す。
Grant削除時に、同じuser+clientの全トークン(アクセストークン、リフレッシュトークン)も削除される(Auth0スタイル)。
public class AuthorizationGranted {
AuthorizationGrantedIdentifier identifier;
AuthorizationGrant authorizationGrant;
LocalDateTime createdAt;
LocalDateTime updatedAt;
public Map<String, Object> toMap() {
// id, user, client, scopes, created_at, updated_at を返す
}
}
public class AuthorizationGrant {
TenantIdentifier tenantIdentifier;
User user;
Authentication authentication;
RequestedClientId requestedClientId;
ClientAttributes clientAttributes;
GrantType grantType;
Scopes scopes;
GrantIdTokenClaims idTokenClaims;
GrantUserinfoClaims userinfoClaims;
CustomProperties customProperties;
AuthorizationDetails authorizationDetails;
ConsentClaims consentClaims;
}
ConsentClaims は、クライアントの tos_uri(利用規約)と policy_uri(プライバシーポリシー)への同意を追跡する。
規約が変更された場合、既存の同意は無効化され、ユーザーに再同意を要求する。
// ConsentClaims: カテゴリ別の同意リスト
Map<String, List<ConsentClaim>> claims;
// カテゴリ: "terms"(tos_uri), "privacy"(policy_uri)
// ConsentClaim: 個別の同意レコード
public class ConsentClaim {
String name; // "tos_uri" or "policy_uri"
String value; // URI値
LocalDateTime consentedAt; // 同意日時
}
{
"terms": [
{"name": "tos_uri", "value": "https://example.com/terms/v1", "consented_at": "..."},
{"name": "tos_uri", "value": "https://example.com/terms/v2", "consented_at": "..."}
],
"privacy": [
{"name": "policy_uri", "value": "https://example.com/privacy/v1", "consented_at": "..."}
]
}
規約が更新されるたびに新エントリが追加される(上書きではなく履歴追加)。
認可リクエスト時:
1. OAuthRequestContext.createConsentClaims()
→ クライアントの現在の tos_uri / policy_uri から ConsentClaims を生成
2. authorizationGranted.isConsentedClaims(consentClaims)
→ AuthorizationGrant.isConsentedClaims()
→ ConsentClaims.isAllConsented()
→ 各 ConsentClaim の name + value が一致するかチェック
3. 不一致の場合:
→ OAuthRedirectableBadRequestException("interaction_required",
"authorization request contains unauthorized consent")
ConsentClaim.equals(): name + value で比較(consentedAt は無視)ConsentClaims.isAllConsented(): リクエスト側の全 ConsentClaim が保存済みリストに contains されるかチェックConsentClaims.merge(): 同じ claim は最古の consentedAt を保持、新しい claim は履歴に追加| ファイル | 役割 |
|---|---|
ConsentClaim.java | 個別の同意レコード(name, value, consentedAt) |
ConsentClaims.java | 同意コレクション(merge, isAllConsented) |
OAuthRequestContext.java | ConsentClaims生成 + 同意比較(canAutomaticallyAuthorize) |
OAuthAuthorizeContext.java | AuthorizationGrant生成時にConsentClaimsを含める |
ClientConfiguration.java | クライアントの tosUri / policyUri を保持 |
e2e/src/tests/
├── usecase/standard/
│ └── standard-05-grant-revocation.test.js # Grant取り消しE2E
└── scenario/control_plane/organization/
└── organization_grant_management.test.js # Grant管理APIテスト
# ビルド
./gradlew :libs:idp-server-core:compileJava
./gradlew :libs:idp-server-control-plane:compileJava
# E2Eテスト
cd e2e && npm test -- src/tests/usecase/standard/standard-05-grant-revocation.test.js
cd e2e && npm test -- src/tests/scenario/control_plane/organization/organization_grant_management.test.js
ResourceOwnerPasswordCredentialsGrantServiceでGrant作成ロジックを確認GrantRevocationServiceでdeleteByUserAndClientが呼ばれているか確認ModelConverter.parseLocalDateTime()が正しくパースしているか確認LocalDateTimeParserで対応)