Skip to content

ユースケース ​

以下の各ページは、ソースリポジトリの examples/ にある実行可能な例と対応しています。例は example build tag の背後でビルドされるので、go test ./... にも自分の go.sum にも入りません。

sh
(cd examples/01-minimal && GOWORK=off go run -tags example .)

多くのページは、その機能が解決する問題から始めます。続けて、複雑さに見合う構成と、標準の仕組みで足りる場合を示します。

初めて読む場合は 最小構成の OP と RP のペア、次に 総合バンドル を確認し、自分の構成にその必要が出てきた段階で下の各ページへ進むのがおすすめです。トピックではなく、作りたいものからページを選ぶ場合はここから始めるを使ってください。

このセクションの読み進め方
最小構成の OP から始め、実際に必要になった領域へ進みます。プロファイルとフロー、UI、ストレージと認証、拡張グラント、暗号と運用の 5 つです。最小構成の OPまず起動させるプロファイルとフローFAPI、CIBA、デバイスコード、token exchangeUI と SPA独自画面、アカウントチューザ、ステップアップ MFAストレージと認証SQL、DynamoDB、Redis、自前のユーザストア拡張グラントgrant management、authorization details、動的登録暗号と運用JWE、pairwise subject、protected resource metadata
5 つの行は互いに独立しています。いま作っているものに合う行を選んでください。順番が決まっているのは左の箱だけです。

リファレンスアプリケーション ​

番号付きの example は 1 つのオプションを 200 〜 500 行で切り出したものです。sample/ はそれとは別で、example が飛ばしている「アカウントが生まれてから使われるまで」の一連の流れを扱います。op/storeadapter/composite で束ねた MySQL + Redis の上で動き、docker compose up 一発で次の範囲を通しで試せます。

  • アプリケーション側が持つサインアップ: アカウントの作成自体はアプリケーションの責務のままで、ライブラリの登録用の接続点(LoginFlow.Registration と prompt=create)に組み込みます
  • Argon2id によるパスワード保管
  • アプリケーション自身が実装する interaction.Driver を通したログインと同意
  • アカウント設定画面からの TOTP 登録
  • round-trip を完了する RP
sh
docker compose -f sample/compose.yaml up -d --build

Compose ファイルは OP と RP を 127.0.0.1 だけに公開します。サンプルは、アプリケーションが所有する POST 経路を double-submit 方式の CSRF トークンと Origin の確認で保護しています。パスワード変更と TOTP 登録の確定時には、op.VerifyPassword で現在のパスワードも確認します。これらの保護は OP の対話エンドポイントの外側にあり、アプリケーション側が担当します。

同意画面は scope 単位のきめ細かな同意の実装例になっています。これは同梱の HTML driver が意図的に提供していない部分です。ただしテンプレートではなくデモとして扱ってください。スキーマはあくまで一組み込み側のモデルで、署名鍵と cookie 鍵は起動のたびに再生成され、公開ホスティングを想定した作りにもなっていません。

一覧 ​

各 example フォルダはいずれかのページに対応しています。

起動と組み込み ​

ユースケース例ページ
最小 OP01-minimal最小構成の OP と RP のペア
典型的な option をまとめた構成02-bundle総合バンドル

プロファイルとフロー ​

ユースケース例ページ
OAuth 2.1 または既存 OIDC の姿勢を宣言00-security-profileセキュリティプロファイルの宣言
OIDC と並走する純粋 OAuth 2.004-oauth2-onlyOAuth 2.0(openid なし)
FAPI 2.0 Baseline(ライブラリの PAR + JAR + DPoP 既定値)03-fapi2FAPI 2.0 Baseline
FAPI 2.0 Message Signing(署名付きリクエスト、JARM、署名付き introspection、DPoP nonce source)54-fapi2-message-signing。nonce のやり取りは 51-dpop-nonceFAPI 2.0 Message Signing
TLS を終端するプロキシの背後で、証明書に結び付いたトークンを使う FAPI 2.0(WithMTLSProxy + WithTrustedProxies)55-mtls-proxyFAPI 2.0 Baseline
ネイティブアプリ: public クライアント、PKCE、loopback 127.0.0.1 の redirect38-native-app構成を選ぶ
サービス間通信用のトークン05-client-credentialsサービス間(client_credentials)
事前登録なしで、HTTPS URL で名乗る MCP クライアントを受け入れるなしMCP 認可サーバ
DPoP のサーバ nonce フロー51-dpop-nonceDPoP nonce
OP のトークンで API(op/rs)を守り、ルートごとにマウントする36-resource-serverAPI を守る
OP が守る API の protected resource メタデータ(RFC 9728)を公開するなしProtected resource メタデータ

UI ​

ユースケース例ページ
組み込み HTML のログイン・同意・アカウント選択19-default-uiUI の方式を選ぶ
SPA から UI を扱う16-custom-interaction、10-react-login、17-spa-composite-storeSPA / 対話画面のカスタマイズ
カスタム HTML サインイン画面37-custom-login-uiカスタムログイン UI
カスタム HTML 同意画面11-custom-consent-uiカスタム同意 UI
カスタム HTML アカウント選択12-custom-chooser-uiカスタムアカウント選択 UI
マルチアカウント選択(prompt=select_account)13-multi-accountマルチアカウント選択
クロスオリジン SPA (CORS)14-cors-spaSPA 向け CORS
ロケール解決15-i18n-localei18n / ロケール

ストレージ ​

ユースケース例ページ
実 DB に永続化06-sql-store、07-mysql-storeSQL ストア
DynamoDB に永続化18-dynamodb-storeDynamoDB ストア
SQL アダプタのテーブル名を差し替える25-byo-table-namesSQL ストア § テーブル名を差し替える
ストアをゼロから実装する26-byo-store-from-scratchストアバックエンドを自前実装する
Hot / Cold 分離(Redis 揮発)08-composite-hot-cold、09-redis-volatileHot / Cold 分離
SQL、DynamoDB、Redis の Hot / Cold 分離、自前ストアから選ぶなしストレージ構成の選び方

スコープ / claim ​

ユースケース例ページ
Public / Internal スコープ分離60-scopes-public-privatePublic / Internal スコープ
OIDC §5.5 claims リクエスト61-claims-requestClaims リクエスト
Rich authorization requests(RFC 9396)なしRich authorization requests

認証 ​

ユースケース例ページ
MFA、captcha、ステップアップ20-mfa-totp、21-risk-based-mfa、22-login-captcha、23-step-upMFA / ステップアップ
MFA 要素を本体と同じ DB に永続化27-durable-mfa-storeMFA / ステップアップ
Email OTP、recovery code28-email-otp-recoveryMFA / ステップアップ
パスワードの代わりに passkey でサインイン29-passkeyパスワードレス passkey
既存ユーザストアの投影24-byo-userstore既存ユーザストアの投影
bcrypt のパスワードハッシュをログイン時に argon2id へ移行53-production-sqlbcrypt パスワードの移行
直近のサインインを要求するアカウントページ(max_age、rs.RequireMaxAge)なしアカウントページ

拡張グラント ​

ユースケース例ページ
カスタム grant_type URN30-custom-grantカスタム grant
Device Code (RFC 8628)31-device-code-cliDevice Code
CIBA ポーリング方式32-ciba-posCIBA
トークン交換(RFC 8693)33-token-exchange-delegationトークン交換
信頼するパートナーの署名付き assertion を access token と引き換える(RFC 7523)なしJWT bearer grant
組織をまたぐアイデンティティチェーン: ID-JAG の発行と引き換え(experimental)なしID-JAG
クライアントが id で参照・マージ・失効できる長命な grantなしGrant management

暗号と subject ​

ユースケース例ページ
Pairwise subject(OIDC Core §8.1)34-pairwise-saasPairwise subject
暗号化 id_token(JWE)35-encrypted-id-tokenJWE 暗号化

ガバナンス ​

ユースケース例ページ
ファーストパーティ同意スキップ40-first-party-skip-consentファーストパーティ同意スキップ
動的クライアント登録(RFC 7591)41-dynamic-registration動的クライアント登録
Back-Channel Logout 1.042-back-channel-logoutバックチャネルログアウト
RP の登録・更新・削除: 静的 seed とコード上の差し込み口53-production-sqlクライアントオンボーディングのパターン

運用 ​

ユースケース例ページ
Prometheus メトリクス52-prometheus-metricsPrometheus メトリクス
FAPI TLS ポリシーと public JWKS の読み込み50-fapi-tls-jwksFAPI 2.0 Baseline

番号体系 ​

例フォルダは、書かれた順ではなくトピック別に分けています。

帯トピック
00–09基本構成、コアフロー、プロファイル、ストレージアダプタ
10–19UI とブラウザ統合(SPA、同意、アカウント選択、CORS、i18n)
20–29MFA、認証ルール、ユーザストアの投影
30–39拡張グラント、subject mode、暗号化トークン、ID 連携、リソースサーバ。37 は UI のあふれ分
40–49ガバナンス: ファーストパーティ、動的登録、バックチャネルログアウト
50–59運用: FAPI ヘルパ、メトリクス、トレーシング、DPoP nonce
60–69scope、claim、適合性に近い example

ソースリポジトリの README が一次インベントリです。