Skip to content

Options 索引

op.New に渡せる公開オプションを、触る対象のレイヤごとに分類しました。WithIssuerWithStoreWithKeyset は常に必須です。WithCookieKeysauthorization_code grant を有効にしている場合に必須で、既定 grant 集合では有効です。それ以外は既定を上書きする任意オプションです。

このページの読み方

オプション名のリンクから詳細ページに飛べます。「セクション」列は、そのオプションが動かす Discovery 文書やエンドポイントの表面です。「既定」が空欄のオプションは組み込みの初期値を持っておらず、明示的に渡したときだけ機能が有効になります。

どのオプションが必要か

このページは、op.New に渡せる公開オプションを並べた索引です。70 以上のオプションがあるため、目的が決まった状態で表を眺めると目当てが探しにくいことがあります。下の決定木で関連するエリアを当てたうえで、表の対応セクションに飛んでください。

設定の目的(新規 OP / FAPI 切り替え / 単一機能 / grant 制限 / 送信者制約 / トークン形式)を、それを担う op.New オプションに振り分け、該当なしなら下の表へ導く決定木。OP を新規に立ち上げる?必須オプションはいいいえFAPI 2.0 を 1 行で有効化?WithProfile(...)はいいいえ機能を 1 つだけ有効化?WithFeature(...)はいいいえ/token の grant を絞る?WithGrants(...)はいいいえ送信者制約付きトークン?WithFeature(DPoP|MTLS)はいいいえJWT か opaque か?WithAccessTokenFormat(...)はいいいえ該当なし — 下の表をセクションごとに参照。
  • これから新規に OP を立ち上げる → まず WithIssuerWithStoreWithKeyset、そして通常は WithCookieKeys を渡します。WithCookieKeysauthorization_code grant が有効な場合に必須で、既定 grant 集合では有効です。詳しくは必須オプション最小 OP の組み立て
  • FAPI を採用せず OAuth 2.1 の姿勢を明示したいWithProfile(profile.Baseline) はすべての authorization-code request に PKCE を要求し、それ以外は OIDC Core の既定を保ちます。FAPI 2.0 には profile.FAPI2Baseline(または profile.FAPI2MessageSigningprofile.FAPICIBA)を使います。これらのプロファイルは mTLS が明示されていなければ DPoP を既定選択します。プロファイルが必要とする grant が組み込まれていない場合、OP はエンドポイントを勝手に mount せず op.New が失敗します(profile.FAPICIBAgrant.CIBA を必要とします)。使い方: セキュリティプロファイルの宣言使い方: FAPI 2.0 Baselineガイド: FAPI を参照。
  • プロファイル全体ではなく、機能を 1 つだけ有効にしたいWithFeature(feature.PAR) / JAR / JARM / DPoP / MTLS / Introspect / Revoke。public / native client は常に PKCE 必須で、FAPI プロファイル下ではすべての認可コードクライアントに PKCE が必須です。Dynamic Registration、RAR、Grant Management は追加設定が必要なので、それぞれ専用オプションから有効化します。
  • /token で受け付ける grant の集合を絞りたいWithGrants(grant.AuthorizationCode, grant.RefreshToken, grant.ClientCredentials, grant.DeviceCode, grant.CIBA)WithDeviceCodeGrant() / WithCIBA(...) / WithCustomGrant(...) / RegisterTokenExchange(...) は、それぞれ追加で必要なエンドポイントもまとめて公開します。
  • 送信者制約付きのアクセストークンにしたい → DPoP 系: WithFeature(feature.DPoP) + 必要に応じて WithDPoPNonceSource(op.NewInMemoryDPoPNonceSource(...))。mTLS 系: WithFeature(feature.MTLS) + 必要に応じて WithMTLSProxy(headerName, trustedCIDRs)。詳しくはガイド: 送信者制約付きトークンDPoPmTLS使い方: DPoP nonce
  • アクセストークンを JWT / opaque で切り替えたい → OP 全体の既定は WithAccessTokenFormat(...)、RFC 8707 リソースごとに分けたいときは WithAccessTokenFormatPerAudience(...)ガイド: アクセストークンの形式 を参照。
  • sector ごとに pairwise sub にしたいWithPairwiseSubject(salt)(32 byte 以上の salt)。使い方: pairwise subject を参照。
  • 起動時にクライアントを静的に投入したいWithStaticClients(op.PublicClient(...), op.ConfidentialClient(...), op.PrivateKeyJWTClient(...))ガイド: クライアントの種類 を参照。
  • Dynamic Client Registration を使いたいWithDynamicRegistration(...)使い方: Dynamic Client Registration を参照。
  • introspection / revocation エンドポイントを公開したいWithFeature(feature.Introspect) および / または WithFeature(feature.Revoke)。細かな調整は下の「プロファイル / feature / grant」表を参照。
  • scope カタログを拡張したい → discovery に出す scope は WithScope(op.PublicScope("name", "label"))、内部用は WithScope(op.InternalScope("name"))ガイド: scope と claim使い方: scope を参照。
  • 独自の grant_type を生やしたいWithCustomGrant(handler)使い方: custom grant を参照。
  • i18n(国際化)対応をしたいWithDefaultLocale(...)WithLocale(bundle)WithPreferredLocaleStore(...)使い方: i18n を参照。
  • id_token / userinfo / JARM / introspection を JWE で暗号化したいWithEncryptionKeyset(...) と、必要なら既定許可リストを狭める WithSupportedEncryptionAlgs(algs, encs)使い方: JWE 暗号化 を参照。
  • SPA クライアント向けに CORS を開けたいWithCORSOrigins(...)使い方: SPA 向け CORS を参照。
  • Prometheus メトリクスを出したいWithPrometheus(registry)。ライブラリは /metrics を公開しないため、ハンドラの公開はルーター側で行います。使い方: Prometheus メトリクス を参照。
  • 監査ログをアプリログとは別の出力先に流したいWithAuditLogger(*slog.Logger)Audit イベントカタログ を参照。
  • SPA 向けに対話レイヤをまるごと差し替えたいWithInteractionDriver(interaction.Driver)使い方: SPA 向け対話のカスタマイズ を参照。

必須と条件付き必須

Optionセクション既定
WithIssuerstringdiscovery issuer / JWT iss / cookie scope
WithStorestore.Storeプロトコル状態のすべてのサブストア
WithUserStorestore.UserStoreWithStore のバックエンドをラップせず、アプリケーション所有の user store から ID トークンと /userinfo の claim を読むWithStore(...).Users()
WithKeysetop.Keyset(P-256 / ES256)JWKS / JWS 署名
WithCookieKeys32 byte の鍵session / CSRF cookie の AES-256-GCMauthorization_code 有効時に必須

プロファイル / feature / grant

Optionセクション既定
WithProfileprofile.Profileprofile.Baseline(OAuth 2.1: すべての authorization-code request に PKCE)または FAPI プロファイルを宣言。FAPI プロファイルが DPoP-or-mTLS を要求し、mTLS が明示されていなければ DPoP を既定の送信者制約方式として選択。プロファイルが要求する feature は自動で有効化されるが、grant が足りない場合は op.New が失敗し、有効化に必要なオプション名をエラーが示す。なし
WithFeaturefeature.Flag(1 呼び出しで 1 つ、繰り返し可)PAR / DPoP / mTLS / JAR / JARM / introspect / revoke を個別に有効化控えめな既定
WithGrants...grant.Type(可変長)/token で受け付ける grant を限定。呼び出せるのは 1 回だけなので、複数の helper から option を合成する場合は渡す前に grant 集合をまとめてくださいauthorization_coderefresh_token
WithScopeop.Scope(1 呼び出しで 1 つ。op.PublicScope / op.InternalScope コンストラクタを利用)scope カタログを拡張openidprofileemailaddressphoneoffline_access
WithOpenIDScopeOptional(引数なし)OAuth 2.0 単独(scopeopenid を含まない)を許容openid 必須
WithStrictOfflineAccess(引数なし)refresh_token の発行を offline_access の同意取得時に限定緩い既定(openid が付与されれば発行)

クライアント / 登録

Optionセクション既定
WithStaticClients...op.ClientSeed(op.PublicClient / op.ConfidentialClient / op.PrivateKeyJWTClient を渡す)起動時にクライアントレジストリを初期投入
WithFirstPartyClients...string(client ID)ファーストパーティ同意スキップの対象なし
WithDynamicRegistrationop.RegistrationOption/register を公開(RFC 7591 / 7592)無効

認証 / LoginFlow

Optionセクション既定
WithLoginFlowop.LoginFlowStep + Rule の宣言的 DAG(推奨)なし
WithAuthenticators...op.Authenticator(可変長)低レイヤ API(WithLoginFlow とは排他)なし
WithInteractionDriverinteraction.Driver対話レイヤのトランスポート全体を差し替え(HTML ドライバ / SPA ドライバ / 独自実装)同梱の HTML ドライバ
WithInteractions...op.Interaction(可変長)ドライバの上に重ねる、資格情報以外の追加画面(T&C、KYC など)consent のみ
WithCaptchaVerifierop.CaptchaVerifierStepCaptcha の上流 captcha プロバイダなし
WithRiskAssessorop.RiskAssessorRuleRiskLoginContext.RiskScore の供給元なし
WithLoginAttemptObserverop.LoginAttemptObserverRuleAfterFailedAttempts 用の失敗回数集計なし
WithMFAEncryptionKeys32 byte の鍵TOTP シークレットを AES-256-GCM で保存時暗号化なし
WithAuthnLockoutStorestore.AuthnLockoutStoreRuleAfterFailedAttempts が参照する subject 単位の失敗回数を永続化なし
WithACRPolicyop.ACRPolicy(interface)ステップアップの acr / aal マッピングidentity

WithAuthnLockoutStore を未設定のままにすると cross-factor 追跡は無効になり、TOTP / email-OTP それぞれの標準カウンタだけが働きます。設定すると、組み込みの possession / recovery factor(StepTOTPStepEmailOTPStepRecoveryCode)で cross-factor 追跡が有効になります。primary password / passkey や ExternalStep の custom factor は自動では包まれず、組み込み側の user store または custom authenticator の責務です。SQL と DynamoDB adapter はどちらも AuthnLockouts() から耐久 store を公開します。inmem.Store.AuthnLockouts() はプロセスローカルで、再起動時にリセットされます。

認証 factor のレコードは意図的に store.Store の外にあります。StepTOTP / PrimaryPasskey / StepRecoveryCode / StepEmailOTP はそれぞれ専用 store を受け取ります。登録スキーマ、暗号鍵、アカウント復旧ポリシーは組み込みアプリケーション側の設計だからです。in-memory、SQL、DynamoDB adapter は対応する accessor を公開します。examples/27-durable-mfa-store は、同梱 SQL adapter の factor store を OP のコアテーブルと同じ DB で使う例です。別のバックエンドでだけ factor-store 契約を自前実装してください。

耐久 store 実装者向けに重要な factor-store 契約が 2 つあります。store.EmailOTPStore.Get は code の ExpiresAt だけでなく EmailOTPRecord.RetainUntil までは record を読める状態に保つ必要があります。これにより、code が失効しても resend cap と brute-force counter はリセットされません。store.RecoveryStore.Consume は、提示された code hash と現在保存されている slot の hash を比較し、古い hash を拒否する必要があります。recovery code を再生成した後に、漏洩済みの古い code が新しい batch の slot を消費するのを防ぐためです。

UI

Optionセクション既定
WithSPAUIop.SPAUI(構造体: LoginMount / ConsentMount / LogoutMount / StaticDir)SPA の入口と静的アセット一式を OP 側で公開し、interaction の状態も JSON で提供無効
WithConsentUIop.ConsentUI(*html/template.Template をラップ)同意画面を組み込み側テンプレートで描画。state / CSRF / 永続化は OP が担当同梱テンプレート
WithChooserUIop.ChooserUI(*html/template.Template をラップ)prompt=select_account を組み込み側テンプレートで描画同梱テンプレート
WithCORSOrigins...string厳格 CORS の許可リスト(未指定なら redirect URI から自動導出)自動導出
WithDefaultLocaleop.Locale(BCP 47 タグ)ui_locales が無いリクエスト時の既定ロケール"en"
WithLocaleop.LocaleBundle(1 呼び出しで 1 つ、繰り返し可)同梱 HTML ドライバ用のロケール別メッセージバンドルを登録英語 + 日本語の初期バンドル
WithPreferredLocaleStoreop.PreferredLocaleStore§L.2 優先順序の先頭で参照されるユーザ単位ロケール上書きなし

WithSPAUIWithConsentUI は相互排他です。どちらも同意画面の描画を受け持つためです。WithChooserUIWithSPAUI と同時指定できますが、SPA モードではアカウント選択も JSON の状態取得を通じて SPA が描画します。そのため chooser テンプレートは使われず、op.New が構造化された警告を出します。詳細は カスタムアカウントチューザ UI を参照してください。

トークン

Optionセクション既定
WithAccessTokenFormatop.AccessTokenFormat(AccessTokenFormatJWT / AccessTokenFormatOpaque)OP 全体で JWT / opaque を選択JWT
WithAccessTokenFormatPerAudiencemap[string]op.AccessTokenFormat(RFC 8707 リソース → 形式)audience ごとに形式を切り替えOP 全体の値
WithAccessTokenRevocationStrategyop.AccessTokenRevocationStrategy(RevocationStrategyGrantTombstone / RevocationStrategyJTIRegistry / RevocationStrategyNone)発行済 JWT アクセストークンの失効ポリシー。既定の GrantTombstoneStore.GrantRevocations()JTIRegistryStore.AccessTokens() を必須とし、いずれも op.New で検査されるgrant tombstone
WithAccessTokenTTLtime.Durationアクセストークンの寿命5 分
WithRefreshTokenTTLtime.Duration通常のリフレッシュトークンの寿命30 日
WithRefreshTokenOfflineTTLtime.Durationoffline_access が付与されたときのリフレッシュトークンの寿命WithRefreshTokenTTL を継承(ゼロ値で延長しない)
WithRefreshGracePeriodtime.Duration(0 で無効化、負値は拒否)ローテーション後の猶予期間60 秒
WithDPoPNonceSourceop.DPoPNonceSource(interface)サーバ供給の DPoP nonce ストア(op.NewInMemoryDPoPNonceSource が同梱実装)なし

WithInMemoryDPoPNonceLoggerop.New ではなく op.NewInMemoryDPoPNonceSource に渡す補助オプションです。同梱の in-memory nonce source を使う場合だけ指定します。

Discovery / エンドポイント

Optionセクション既定
WithEndpointsop.Endpoints(構造体: 各エンドポイントのパス上書き)各エンドポイントのパスを上書き仕様の既定
WithMountPrefixstring(/ で始める。ルートに置くなら /)issuer 直下にプリフィックスを設けて公開/oidc
WithClaimsSupported...string(可変長)discovery の claims_supported を埋める省略
WithClaimsParameterSupportedboolclaims_parameter_supported を切り替える。false の場合、authorize / PAR は malformed JSON の拒否後に claims の中身を無視するtrue
WithACRValuesSupported...string(可変長)acr_values_supported を公開。FAPI / eIDAS / NIST 800-63 のように特定の ACR 値を扱う配備が広告するために使う空(discovery に出ない)
WithDiscoveryMetadataop.DiscoveryMetadata(型付きの service_documentation / policy / TOS / UI locale / mTLS alias フィールド + Extra map[string]any)OP が所有しない RFC 8414 / OIDC Discovery メタデータを discovery 文書に追加。UILocalesSupported は非空時に自動導出された locale list を上書きし、OP 管理フィールドと衝突する Extra key は拒否なし
WithPARLifetimetime.Duration/par が発行する request_uri の寿命を上書き。失効判定はブラウザが /authorize に URI を提示した時点で行い、その後の code 発行では単回使用性だけを強制60 秒
WithJWKSRotationActivefunc() boolローテーション期間中だけ JWKS の Cache-Control を短期キャッシュに切り替える述語常に長期キャッシュ

subject 戦略

Optionセクション既定
WithSubjectGeneratorop.SubjectGenerator(interface)sub claim の導出を上書き。同梱の op/subject.UUIDv7 が既定UUIDv7 通し
WithPairwiseSubject[]byte salt(32 byte 以上)OIDC Core §8.1 の sector ごと pairwise sub 導出を有効化。途中で戦略を切り替えると op.New が拒否するpublic(UUIDv7)

詳細は 使い方: pairwise subject

grant — Device Code / CIBA / Custom / Token Exchange

Optionセクション既定
WithDeviceCodeGrant(引数なし)RFC 8628 device-authorization grant を有効化。/device_authorization を公開し /token に URN を登録無効
WithDeviceVerificationURIstring(絶対 URL)デバイス画面に表示する verification URI を上書き(既定は <issuer>/device)自動導出
WithDeviceCodeExpirytime.Duration新規 device_code レコードの expires_in 寿命を上書き。アクセストークン TTL とは独立10 分
WithDeviceCodePollIntervaltime.Duration広告する poll interval を上書き。これより速い poll は slow_down5 秒
WithCIBA...op.CIBAOptionCIBA poll mode を有効化。/bc-authorize を公開し CIBA URN を登録。サブオプション: WithCIBAHintResolver(必須)、WithCIBADefaultExpiresInWithCIBAMaxExpiresInWithCIBAPollIntervalWithCIBAMaxPollViolations無効
WithCustomGrantop.CustomGrantHandler組み込み側が定義する grant_type URN を /token に登録。handler はアクセストークンをそのまま返すか、BoundAccessToken 要求として返して OP に署名させるなし
RegisterTokenExchangeop.TokenExchangePolicyRFC 8693 token-exchange grant を有効化。ポリシーがリクエスト単位で受理可否(admission)を判断し、OP の既定値をさらに狭めることもできる無効

WithDeviceCodeExpiryWithDeviceCodePollIntervalWithAccessTokenTTL から導出されません。アクセストークンを短命にしても、TV / CLI のペアリング手順までユーザがセカンドスクリーンに移る前に失効しないようにするためです。詳細は 使い方: device codeCIBACustom grantToken exchange

認可機能 — RAR / Grant Management / Protected Resource Metadata

オプション説明既定
WithAuthorizationDetailTypes...op.AuthorizationDetailTypeRFC 9396 Rich Authorization Requests を有効化。受理する type を validator とともに登録する。authorization_details/authorize/par/token で検証され、grant に永続化され、JWT アクセストークンと introspection に反映され、discovery で公開される。nil の Validateop.New で拒否される無効
WithGrantManagement(actions []op.GrantManagementAction, actionRequired bool)OAuth 2.0 Grant Management draft を有効化。grant_management_action / grant_id を処理し、query / revoke エンドポイントを公開し、token 応答に grant_id を載せ、設定した action 集合を discovery で公開する。Experimental(IETF draft 追跡)無効
WithProtectedResources...op.ProtectedResource登録した各リソースについて RFC 9728 protected-resource メタデータを /.well-known/oauth-protected-resource とリソース path の接尾辞で公開し、authorization_servers に issuer を載せるなし

op.StepUpChallenge(realm, acrValues, maxAge)op.New のオプションではなく独立したヘルパで、組み込み側のリソースサーバが返す RFC 9470 の WWW-Authenticate: Bearer challenge を組み立てます。OP 自身はこれを発行しません。

詳細は Rich authorization requestsGrant managementProtected resource metadataMFA / ステップアップ

暗号化(JWE)

Optionセクション既定
WithEncryptionKeysetop.EncryptionKeyset(RSA 2048 bit 以上 / EC P-256/384/521 の秘密鍵、use=enc)暗号化用 JWK を公開。inbound JWE request_object と outbound JWE 応答(id_token / userinfo / JARM / introspection)に必要なし
WithSupportedEncryptionAlgs(algs []string, encs []string)既定の許可リスト(RSA-OAEP-256 / ECDH-ES{,+A128KW,+A256KW} × A{128,256}GCM)を 狭める だけ。広げることはできない既定の許可リスト全体

詳細は 使い方: JWE 暗号化

mTLS / プロキシ / ネットワーク

Optionセクション既定
WithMTLSProxy(headerName string, trustedCIDRs []string)エッジでヘッダ経由の mTLS を終端なし
WithTrustedProxies...string(CIDR)X-Forwarded-* / Forwarded から実クライアント IP を解決なし
WithTrustedProxyHosts...string(hostname)trusted proxy CIDR が設定されている場合に、正規の issuer host 以外の X-Forwarded-Host 許可リストを追加issuer host のみ
WithAllowLocalhostLoopback(引数なし)開発 / ネイティブアプリデモ用に RFC 8252 の loopback 緩和へ文字列 localhost を追加し、issuer 自体にも localhost を許可。リテラル 127.0.0.1 / [::1] は厳格既定のままリテラル loopback のみ
WithAllowPrivateNetworkJWKS(引数なし)RFC 1918 上の client JWKS を許容(テスト専用)拒否
WithAllowPrivateNetworkJAR(引数なし)RFC 1918 上の request_uri を許容(テスト専用)拒否
WithAllowPrivateNetworkSector(引数なし)dynamic registration 時の sector_identifier_uri が RFC 1918 上にあることを許容(テスト / private RP network 専用)拒否
WithJWKSHTTPTransporthttp.RoundTripperJAR と private_key_jwt が使う RP 管理 JWKS 取得の transport を差し替える。接続時の SSRF 判定は維持されるシステム trust の transport
WithBackchannelAllowPrivateNetworkboolRFC 1918 上の backchannel_logout_uri を許容(テスト専用)false
WithAllowInsecureBackchannelLogoutForDev(引数なし)dev / CI fixture 用に plain-HTTP loopback の backchannel_logout_uri と配送を許容拒否
WithBackchannelLogoutHTTPClient*http.ClientBack-Channel ログアウト用の HTTP クライアント既定
WithBackchannelLogoutTimeouttime.DurationRP ごとの 一斉通知 タイムアウト5 秒

観測

Optionセクション既定
WithLogger*slog.Logger構造化された運用ログ(handler は redaction ミドルウェアで包まれる)discard
WithAuditLogger*slog.Logger監査イベント専用のロガーWithLogger を継承
WithPrometheus*prometheus.RegistryOP のカウンタを呼び出し側のレジストリに登録(/metrics は公開しない)なし

運用方針

Optionセクション既定
WithSessionDurabilityPostureop.SessionDurabilityPostureBack-Channel Logout の監査ログに方針を注釈付け(SOC 用途)volatile
WithClockop.Clock時刻ソース(テスト用に注入)time.Now

ここでは設定しないもの

意図的にオプションにしていない項目です。理由は各リンク先の設計判断を参照してください。

  • JOSE 検証用の許可リスト — client assertion、JAR request object、DPoP proof など入力側の署名検証では RS256 / PS256 / ES256 / EdDSA の固定集合を使います。OP が発行する JWT の署名は ES256 のみです。どちらの面も広げるフラグはありません。セキュリティ方針 §2 を参照。
  • PKCE methodS256 のみ。plain は構造的に拒否されます。
  • Cookie scheme__Host- プリフィックス、AES-256-GCM、double-submit CSRF が常に有効です。必須オプション § WithCookieKeys を参照。
  • 乱数源crypto/rand のみ。math/rand は lint で禁止しています。
  • /metrics の公開 — ライブラリではなくルーター側の責務です。使い方: Prometheus を参照。

このリストの裏取り

カタログはライブラリ本体から grep で生成しています。自分で監査するには:

sh
git clone https://github.com/libraz/go-oidc-provider.git
cd go-oidc-provider
grep -rhE '^func With[A-Z]|^func RegisterTokenExchange' \
  op/options.go op/options_authn.go op/options_clients.go \
  op/options_ciba.go op/options_customgrant.go op/options_devicecode.go \
  op/options_discovery.go op/options_encryption.go op/options_features.go \
  op/options_fapi_proxy.go op/options_protocol.go op/options_session.go \
  op/options_subject.go op/access_token_revocation.go op/i18n.go \
  op/registration.go op/authorization_details.go op/grant_management.go \
  op/protected_resource.go \
  | sort -u

関数名と受け取る型のシグネチャが正典であり、各関数の godoc コメントが契約の正本です。