RFC 対応一覧
本ライブラリがコード中で参照しているすべての規格を、実装パッケージとゲートになるオプション・feature と対応づけて一覧化しています。
ステータスの凡例
full その仕様について本ライブラリが対象とする OP 側 surface を end-to-end で実装しています。
partial OP として必要な部分は実装済みです(設計上スコープ外の任意章は除きます)。
planned 対応予定。まだ着地していません。
out out-of-scope(設計上、本ライブラリの責務ではない)。
refused 意図的に拒否しています(例: alg=none)。
OIDC core / discovery
| 仕様 | ステータス | 場所 |
|---|---|---|
| OpenID Connect Core 1.0 | partial(response_type は code のみ。Aggregated / Distributed claim types §5.6.2 は emit せず、pairwise sub §8.1 は op.WithPairwiseSubject で実装済み。詳細は下の「設計上の対象外」セクション) | op/、internal/authorize、internal/tokenendpoint、internal/userinfo、internal/sector |
| OpenID Connect Discovery 1.0 | full | internal/discovery |
| OpenID Connect Dynamic Client Registration 1.0 | partial(主要フロー、sector_identifier_uri の取得、application_type=web / =native ごとの redirect URI 規則、JWKs / pairwise / response_type のクロスチェック、PUT の予約フィールド拒否、post_logout_redirect_uris の往復、5 種の JWE alg/enc encrypted-response メタデータまでを強制。GET /register/{id} の応答からは client_secret を意図的に除外、software_statement も非対応) | internal/registrationendpoint |
| OpenID Connect RP-Initiated Logout 1.0 | full | internal/endsession |
| OpenID Connect Back-Channel Logout 1.0 | full | internal/backchannel |
| OpenID Connect Front-Channel Logout 1.0 | out(iframe / third-party-cookie 依存の通知方式は意図的に非実装。Back-Channel Logout を使う) | — |
| OpenID Connect Session Management 1.0 | out(サードパーティ cookie 依存のため。Back-Channel を推奨) | — |
| OpenID Connect CIBA Core 1.0 | partial(poll 配信のみ。ping / push は対象外) | internal/ciba、internal/cibaendpoint、op.WithCIBA |
OAuth 2.0 系 RFC
| RFC | ステータス | 場所 / オプション |
|---|---|---|
| RFC 6749 OAuth 2.0 Framework | partial(authorization-code、refresh-token、client-credentials の surface。implicit grant と password grant は意図的に非実装) | op/、internal/authorize、internal/tokenendpoint |
| RFC 6750 Bearer Token Usage | partial(OP 発行 bearer token と、UserInfo / introspection など OP が持つ resource endpoint。一般的な RS challenge 挙動はリソースサーバ側の責務) | internal/tokens、internal/userinfo、internal/introspectendpoint |
| RFC 6819 Threat Model & Security Considerations | partial(OP 全体に適用しているセキュリティ指針。独立したプロトコル surface ではない) | コードベース全体 |
| RFC 7009 Token Revocation | full(feature.Revoke でゲート) | internal/revokeendpoint |
| RFC 7521 Assertion Framework | partial(private_key_jwt クライアント認証のみ。assertion grant と client_secret_jwt は意図的に非実装) | internal/clientauth |
| RFC 7523 JWT Bearer Assertions for Client Auth | partial(private_key_jwt。JWT bearer authorization grant と client_secret_jwt は非実装で、client_secret_jwt は登録時点で invalid_client_metadata として拒否) | internal/clientauth |
| RFC 7591 Dynamic Client Registration | partial(feature.DynamicRegistration で制限。software_statement は invalid_software_statement で拒否) | internal/registrationendpoint |
| RFC 7592 DCR Management | partial(read / update / delete を実装。PUT の省略はフィールド削除ではなくサーバデフォルトへのリセットとして扱い、応答での client_secret 再掲は none → confidential への auth method 昇格、または明示的な rotation 要求のいずれかに限定) | internal/registrationendpoint |
| RFC 7636 PKCE | full(S256 のみ。plain は拒否) | internal/pkce |
| RFC 7662 Token Introspection | full(feature.Introspect でゲート) | internal/introspectendpoint |
RFC 7800 Confirmation Methods (cnf) | full | internal/dpop、internal/mtls、internal/tokens |
| RFC 8252 OAuth 2.0 for Native Apps | partial(OP 側の native redirect / loopback 制約を強制。client app 側の挙動は対象外) | internal/registrationendpoint、internal/authorize |
| RFC 8414 Authorization Server Metadata | full | internal/discovery |
| RFC 8485 Vectors of Trust | partial(ACR/AAL マッピング経由で消費) | op/aal.go、op/acr.go |
| RFC 8628 Device Authorization Grant | full(op.WithDeviceCodeGrant で有効化。slow_down の段階的な延長は LastPolledAt と原子的に永続化、op/devicecodekit が総当たり対策と revoke 用 audit hook を同梱) | internal/devicecode、internal/devicecodeendpoint、op/devicecodekit |
| RFC 8693 OAuth 2.0 Token Exchange | full(op.RegisterTokenExchange でゲート。actor が subject と異なる場合は act チェーン必須、cnf はリクエストの DPoP / mTLS で再バインド) | internal/customgrant/tokenexchange |
| RFC 8705 OAuth 2.0 mTLS Client Auth & Cert-Bound Tokens | full(feature.MTLS でゲート。mtls_endpoint_aliases を discovery で公開) | internal/mtls |
| RFC 8707 Resource Indicators | partial(authorize / token / device / CIBA での正規化と client allow-list 検証を実装。v1.x の組み込み grant は多くの経路で単一 resource 値に絞る) | internal/resourceindicator、internal/authorize、internal/tokenendpoint、internal/devicecodeendpoint、internal/cibaendpoint |
| RFC 8725 JWT Best Current Practices | full(alg allow-list、typ チェック) | internal/jose |
| RFC 9068 JWT Profile for Access Tokens | full | internal/tokens |
| RFC 9101 JAR (JWT-Secured Authorization Request) | full(feature.JAR でゲート) | internal/jar |
| RFC 9126 PAR (Pushed Authorization Requests) | full(feature.PAR でゲート) | internal/parendpoint |
| RFC 9207 OAuth 2.0 Authorization Server Issuer Identifier | full | internal/authorize(応答に iss パラメータを付与) |
RFC 9396 Rich Authorization Requests (authorization_details) | full(op.WithAuthorizationDetailTypes で有効化。/authorize、/par、/token で検証し、grant に永続化し、JWT アクセストークンと introspection に反映し、discovery で公開) | internal/authorizationdetails、op/authorization_details.go |
| RFC 9449 DPoP | full(§8 nonce フロー含む。feature.DPoP でゲート) | internal/dpop、op.WithDPoPNonceSource |
| RFC 9470 OAuth 2.0 Step Up Authentication Challenge | full(OP は ACR rule で acr_values / max_age の再認証を尊重。op.StepUpChallenge が組み込み側 RS の返す WWW-Authenticate challenge を組み立てる) | op/rule.go(RuleACR)、op/stepup.go |
| RFC 9700 OAuth 2.0 Security Best Current Practice | partial(OP 側 BCP posture。リソースサーバ / client 側要件は組み込み側の責務) | コードベース全体 |
| RFC 9701 JWT Response for OAuth 2.0 Token Introspection | full(既定は signed JWT。client の introspection_encrypted_response_alg / _enc メタデータに応じて JWE で wrap) | internal/introspectendpoint、internal/jose |
| RFC 9728 OAuth 2.0 Protected Resource Metadata | full(op.WithProtectedResources で有効化。/.well-known/oauth-protected-resource で配信し、authorization_servers に issuer を刻む) | internal/protectedresource、op/protected_resource.go |
IETF ドラフト
| ドラフト | ステータス | 場所 |
|---|---|---|
OAuth 2.0 Grant Management(draft-ietf-oauth-grant-management) | partial(op.WithGrantManagement で有効化。grant_management_action / grant_id を処理し、query / revoke エンドポイントをマウントし、token 応答に grant_id を載せ、discovery で公開。IETF draft 追跡のため v1.0 までに surface が変わり得る) | internal/grantmgmtendpoint、op/grant_management.go |
JOSE 系
| RFC | ステータス | 場所 |
|---|---|---|
| RFC 7515 JWS | partial(JWT / JAR / JARM / DPoP / client assertion で使う compact JWS surface。general JSON serialization は公開しない) | internal/jose |
| RFC 7516 JWE | partial — 閉じた許可リスト(RSA-OAEP-256 / ECDH-ES{,+A128KW,+A256KW} × A{128,256}GCM)。inbound JWE request_object(JAR / PAR §6.1)、outbound JWE id_token、JWT-shape userinfo、JARM authorization 応答、RFC 9701 introspection 応答を実装済み。RSA1_5 は refused(CVE-2017-11424 padding oracle)。RSA-OAEP-384/512、dir、対称鍵のみの A*KW は v2+ で対応 | internal/jose、op.WithEncryptionKeyset |
| RFC 7517 JWK | partial(対応済み非対称鍵種の JWK Set 公開と client JWKS 消費。署名用途の対称 oct 鍵は受理しない) | internal/jwks |
| RFC 7518 JWA | partial — 発行は ES256 のみ。検証は RS256、PS256、ES256、EdDSA を受理。HS* と none は refused | internal/jose |
| RFC 7519 JWT | partial(OIDC / OAuth 拡張で使う signed / encrypted JWT surface。unsecured JWT は拒否) | internal/jose |
| RFC 7638 JWK Thumbprint | full(DPoP cnf.jkt で使用) | internal/dpop |
RFC 8037 Edwards-curve DSA / EdDSA | partial(Ed25519。Ed448 は無効) | internal/jose |
FAPI 系
| プロファイル | ステータス | 切り替え |
|---|---|---|
| FAPI 2.0 Baseline | full(継続回帰検査。OFCS 参照) | op.WithProfile(profile.FAPI2Baseline) |
| FAPI 2.0 Message Signing | full(継続回帰検査) | op.WithProfile(profile.FAPI2MessageSigning) |
| FAPI 1.0 Advanced | out | —(FAPI 2.0 を使用) |
| FAPI-CIBA | full(poll mode。JAR + DPoP|MTLS 必須、アクセストークン TTL 10 分上限、FAPI 2.0 client-auth セット、requested_expiry ≤ 600 秒、JAR iss / aud / exp / nbf 必須、request-object 寿命 ≤ 60 分(FAPI 2.0 Message Signing §5.6)、アクセストークン revocation 必須) | op.WithProfile(profile.FAPICIBA) |
| OpenID iGov High | planned(v2) | profile.IGovHigh(定数あり。ランタイム制約が未着地のため、現状で op.WithProfile(profile.IGovHigh) を渡すと op.New が拒否) |
その他、ライブラリが参照する RFC
| RFC | 用途 |
|---|---|
| RFC 1918 | Back-Channel Logout SSRF 防御のプライベートネットワーク拒否リスト |
| RFC 2606 | テスト / 例で使う予約済み example domain |
| RFC 3986 | URI パース |
| RFC 4122 | UUIDv4 生成 |
| RFC 4226 | TOTP authenticator が使う HOTP の土台 |
| RFC 4514 | mTLS subject DN の DN 処理 |
| RFC 4648 | Base64url エンコーディング |
| RFC 5280 | X.509 証明書検証 |
| RFC 5321 | Email OTP 入力に対する SMTP アドレス長の上限 |
| RFC 6238 | TOTP authenticator |
| RFC 6265 | Cookie 構文 |
| RFC 6711 | Authentication Context Class Reference 値レジストリ |
| RFC 7230 / 7231 / 7232 / 7235 | HTTP/1.1(現在は RFC 9110 が後継) |
| RFC 7239 | trusted proxy 処理での Forwarded header パース |
| RFC 7807 | application/problem+json(一部のエラー経路) |
| RFC 8017 | JOSE 経由で参照する RSA-PSS / RSA-OAEP アルゴリズム |
| RFC 8141 | PAR request_uri 値の URN 処理 |
| RFC 8176 | AMR 値レジストリ |
| RFC 8259 | JSON |
| RFC 9110 | HTTP セマンティクス |
設計上の対象外
OIDC Core や周辺 OAuth 仕様には登場するものの、本ライブラリでは意図的に実装していない項目があります。隣接リポジトリの test/scenarios/catalog/<feature>.yaml に status: out-of-scope 行として記録され、ほかのテストと同じ場所で棚卸しできるようになっています。
response_typeはcodeのみ。 Implicit(id_token、id_token token)、hybrid(code id_tokenほか)、response_type=noneはいずれも発行しません。RFC 9700 §1.4 が implicit grant を非推奨化しており、FAPI 2.0 は code を必須としています。Discovery もresponse_types_supported: ["code"]だけを広告します。fragmentresponse mode は配信路として実装していません。codeのみの発行では URL fragment に入れるものがないためです。queryとform_postは両方とも実装されています(form_postは OIDC Core Form Post Response Mode 1.0 に従って自動送信 HTML フォームを返します)。feature.JARMを有効にすると 4 種の*.jwtバリアントも有効になります。Discovery は既定でresponse_modes_supported: ["query", "form_post"]を広告し、JARM 有効時には*.jwtモードを追加で広告します。- Aggregated / Distributed claim types(OIDC Core §5.6.2)は emit しません。 Normal claim のみを出力します。
_claim_names/_claim_sourcesといったキーはトークンにも UserInfo 応答にも一切登場しません。 client_secret_jwtは登録時点で拒否します。 代わりにprivate_key_jwtを使ってください。HMAC 共有秘密 JWT プロファイルはinvalid_client_metadata: token_endpoint_auth_method client_secret_jwt is not supportedで拒否されます。- JWE alg / enc の許可リストは閉じています。 既定値は
RSA-OAEP-256+ECDH-ES{,+A128KW,+A256KW}(key-wrap)とA{128,256}GCM(content)です。WithSupportedEncryptionAlgsは 狭める だけで、広げることはできません。RSA1_5は永続的に拒否(CVE-2017-11424)。RSA-OAEP-384/RSA-OAEP-512、dir、対称鍵のみのA*KWは v2+ で対応します。 - CIBA の push / ping 配信モードは未実装。 Discovery は
backchannel_token_delivery_modes_supported: ["poll"]のみを広告するので、クライアント側からこの 2 モードを交渉することはできません。 - Custom-grant ハンドラはリフレッシュトークン値を渡せません。 リフレッシュトークンを発行したいハンドラは
CustomGrantResponse.IssueRefreshTokenを立てます。OP が自分のRefreshTokenStoreで資格情報を生成・永続化するため、親子関係、ローテーション、再利用時の連鎖失効、DPoP / mTLS バインディングが保たれます。クライアントがrefresh_tokengrant に登録されていない場合でもアクセストークン応答は成功し、リフレッシュトークンだけが省略され、custom_grant.refresh_droppedが記録されます。
範囲外(意図的)
OAuth / OIDC 圏のすべての RFC が OP の責務というわけではありません。以下は意図的に対応していない仕様で、リソースサーバ・クライアント SDK・その他のレイヤが受け持つべき領域です。
| 仕様 | 対応状況 | 備考 |
|---|---|---|
| RFC 9421 — HTTP Message Signatures | out | リソースサーバ(API 保護)側の関心事であり、OP の責務ではありません。OP 側の対応する仕組みは、認可リクエスト署名に JAR (RFC 9101)、認可レスポンス署名に JARM、/token と /userinfo の所持証明に DPoP (RFC 9449) です。RS 側の HTTP 署名は組み込み側で実装してください。 |
検証方法
この一覧は最新のソース(op/ と internal/)を grep して作成しています。手元で再現できます。
sh
git clone https://github.com/libraz/go-oidc-provider.git
cd go-oidc-provider
grep -rhoE 'RFC [0-9]+' op/ internal/ | sort -u上の表は、そのコマンドの出力結果をベースにしつつ、ライブラリにとって規範的(normative)なものは強調表示し、周辺的(incidental)なものは「その他」にまとめたものです。