認可許諾管理
前提知識
このドキュメントを理解するには、以下の基礎知識が役立ちます:
- OAuth 2.0の基本 - OAuth 2.0の認可の仕組み
- 認可 - 認可サーバーの概要
- 監査ログ - 監査証跡の保持
概要
idp-serverは、OAuth 2.0/OpenID Connectにおける認可許諾(Authorization Grant) と同意(Consent) を管理します。
認可許諾とは、ユーザーがクライアント( アプリケーション)に対して与えた権限の記録です。
idp-serverでは以下のような用途に対応できます:
- ユーザーの同意を記録し、次回以降の同意画面をスキップ
- ユーザーによる同意の取り消し
- 同意履歴の監査証跡としての保持
idp-serverにおける認可許諾管理の設計思想
1. スコープ単位の同意記録
idp-serverは、スコープ単位で同意を記録します。
同意内容:
- 誰が(ユーザーID)
- どのクライアントに(クライアントID)
- どのスコープを(スコープ一覧)
- いつ許可したか(付与日時)
メリット:
- 次回以降、同じスコープであれば同意画面をスキップ
- 新しいスコープが追加された場合のみ同意画面を表示
- ユーザー体験の向上
2. 同意の取り消し
ユーザーは、過去に与えた同意を取り消すことができます。
取り消しの効果:
- 論理削除(
revoked_at設定)で履歴保持 - 関連するアクセストークン・リフレッシュトークンの失効
- 次回アクセス時に再度同意画面を表示
履歴保持の理由:
- 監査証跡として保持
- 統計・分析用途
- 法的証拠
3. 規約・ポリシーの同意追跡(ConsentClaims)
idp-serverは、スコープだけでなくクライアントの利用規約(tos_uri)とプライバシーポリシー(policy_uri)への同意も追跡します。
同意比較の仕組み:
- 認可リクエスト時に、クライアントの現在の
tos_uri/policy_uriからConsentClaimsを生成 - 保存済みの
AuthorizationGranted内のconsent_claimsと比較 - 値が一致しなければ
interaction_requiredエラーを返し、再同意を要求
ConsentClaims のデータ構造:
{
"terms": [
{"name": "tos_uri", "value": "https://example.com/terms/v1", "consented_at": "2026-01-01T10:00:00"},
{"name": "tos_uri", "value": "https://example.com/terms/v2", "consented_at": "2026-03-01T14:00:00"}
],
"privacy": [
{"name": "policy_uri", "value": "https://example.com/privacy/v1", "consented_at": "2026-01-01T10:00:00"}
]
}
- カテゴリ:
terms(利用規約)とprivacy(プライバシーポリシー) - 履歴保持: 規約が更新されるたびに新しいエントリが追加される(上書きではない)
- 比較ロジック:
name+valueの一致で判定(consentedAtは比較に使わない)
再同意が必要になるケース:
| 変更内容 | 結果 | 理由 |
|---|---|---|
tos_uri を変更 | interaction_required | 新しい利用規約への同意が必要 |
policy_uri を変更 | interaction_required | 新しいプライバシーポリシーへの同意が必要 |
| スコープを追加 | interaction_required | 未同意のスコープが含まれる |
| 変更なし | 同意画面スキップ | 全ての同意が有効 |
prompt=noneを使用した認可リクエストでは、再同意が必要な場合にユーザー操作なしでは処理できないためinteraction_requiredエラーが返されます。サードパーティアプリはこのエラーを受け取った場合、通常の認可フロー(同意画面付き)にフォールバックする必要があります。
4. 同意履歴の永続化
同意の記録は、論理削除で履歴を保持します。
3つの状態(スコープ・規約ともに同じライフサイクル):
| 状態 | revoked_at | 意味 | 動作 |
|---|---|---|---|
| 有効 | NULL | 同意が有効 | 同意画面スキップ |
| 取り消し済み | 設定済み | 同意が取り消された | 再度同意画面を表示 |
| ユーザー削除後 | 設定済み | ユーザーは削除されたが履歴は保持 | 監査証跡として保持 |
詳細は concept-13: 監査ログ を参照。
4. ユーザー削除時の扱い
ユーザーが削除された場合、認可許諾は論理削除されます。
なぜ物理削除しないのか:
- 監査証跡として保持が必要
- 「誰が、いつ、どのクライアントに、何のスコープを許可したか」の記録
- コンプライアンス要件
ユーザー削除フロー:
1. DELETE /users/{userId}
2. UserLifecycleEvent(DELETE)発行
3. idp_user を物理削除
4. authorization_granted は論理削除(revoked_at設定)
5. 関連トークンを失効
ユースケース
1. 同意のスキップ: 2回目以降のログイン
初回ログイン時に同意を記 録し、次回以降はスキップ。
- 初回: 同意画面を表示 → ユーザーが承認 → AuthorizationGranted記録
- 2回目以降: 同じスコープなら同意画面をスキップ
- 効果: ユーザー体験の向上、スムーズなログイン
2. 同意の取り消し: ユーザーによるアクセス権限の撤回
ユーザーがクライアントへのアクセス権限を取り消し。
- 操作: ユーザーが同意を取り消し
- 処理: revoked_at設定、関連トークン失効
- 効果: 次回アクセス時に再度同意画面を表示
3. スコープ追加時の再同意
クライアントが新しいスコープを要求した場合、追加スコープのみ同意。
- 既存同意: openid, profile(スキップ)
- 新規スコープ: email(同意画面を表示)
- 効果: 必要最小限の同意プロセス
4. 規約変更時の再同意
クライアントが利用規約やプライバシーポリシーを更新した場合、再同意を要求。
- 変更前:
tos_uri = https://example.com/terms/v1で同意済み - 変更後:
tos_uri = https://example.com/terms/v2に更新 - 動作:
prompt=noneでinteraction_required、通常フローで同意画面を表示 - 効果: ユーザーは新しい規約に明示的に同意する必要がある
プライバシー規制対応
GDPR対応
idp-serverは、GDPR主要条項に対応しています。
Article 7(同意):
- 同意取得の証明: AuthorizationGrantedレコード
- 同意の容易な取り消し: Management API提供
- 同意履歴の記録: 論理削除(revoked_at)で履歴保持
Article 17(忘れられる権利):
- ユーザーデータの物理削除
- 同意記録の論理削除(履歴保持)
- 監査ログは保持(法的義務)
Article 20(データポータビリティ):
- ユーザーの同意履歴をエクスポート可能
- JSON形式での提供
その他の規制
- 個人情報保護法: 同意取得の記録
- CCPA: 消費者の削除権(同意記録の論理削除)
セキュリティ考慮事項
同意の確実な記録
- 同意画面の表示: スコープの意味を明確に説明
- 同意の永続化: データベースに確実に記録
- 同意のタイムスタンプ: いつ同意したかを記録
同意の取り消しの確実性
- 論理削除: revoked_atで取り消し記録
- トークン失効: 関連するすべてのトークンを失効
- 再同意の要求: 次回アクセス時に同意画面を表示
同意記録の保護
- 改ざん防止: 監査ログと同様のアクセス制御
- 履歴の保持: 取り消し後も履歴として保持
- 監査証跡: 同意・取り消し操作をAuditLogに記録
関連ドキュメント
参考仕様
- RFC 6749: The OAuth 2.0 Authorization Framework - OAuth 2.0基本仕様
- OpenID Connect Core 1.0 - OIDC基本仕様
- GDPR - General Data Protection Regulation - EU一般データ保護規則