80 views
# (OpenID Connect Core 1.0) 7. Self-Issued OpenID Provider ###### tags: `oauth2/oidc` 担当::@hijiki51: [toc maxlevel=5] OIDCでは Self-Issued OpenID Provider(以下SIOP)をサポートしている。 SIOPは、端末やブラウザ上で動作し、自己署名ID Tokenを発行する。これを用いて - 端末認証 - 改竄検出 を行うことができる。 SIOPは特別なIssuer Identifier: https://self-issued.me を用いる。 それ以外は通常のOPと同様に扱うことができる。 ## 7.1. Self-Issued OpenID Provider Discovery SIOPに対して dynamic discovery を行った場合、実際に処理は行わず、次の固定値を用いる。 ```json { "authorization_endpoint": "openid:", "issuer": "https://self-issued.me", "scopes_supported": ["openid", "profile", "email", "address", "phone"], "response_types_supported": ["id_token"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "request_object_signing_alg_values_supported": ["none", "RS256"] } ``` :::info OIDFが https://self-issued.me/.well-known/openid-configuration を提供しているのでこちらを用いてもよい ::: ## 7.2. Self-Issued OpenID Provider Registration SIOPを用いる際は、Client の登録は必要ない。Client は登録しなくても OP に登録してあるかのように、以下の Client Registration Response を得る。 - `client_id` - clientの`redirect_uri` - `client_secret_expires_at` - 0 :::info OIDF が https://self-issued.me/registration/1.0/ を提供しており、ここは上記の要件を満たすレスポンスを返すので用いてもよい ::: ### 7.2.1. Providing Information with the "registration" Request Parameter Client が SIOP に追加の登録情報を渡すために以下の Authorization Request Parameter が定義されている - `registration` - **OPTIONAL** - [OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1](https://openid.net/specs/openid-connect-registration-1_0.html)に定義されているJSONオブジェクトである。 - ただし、ここにREQUIREDと書かれているものでも、SIOPにとってはそうでなく、**すべてOPTIONAL**である ## 7.3. Self-Issued OpenID Provider Request Client は以下の形式に従って、 Authentication Request を送信する 説明は各章と同じなので省略する - `scope` - **REQUIRED** - `response_type` - **REQUIRED** - `id_token` 固定 - `client_id` - **REQUIRED** - `id_token_hint` - **OPTIONAL** - `claims` - **OPTIONAL** - `registration` - **OPTIONAL** - `request` - **OPTIONAL** - Client は暗号化したRequest Objectを送信することもできる(**MAY**) - その場合、そのClient に対してすでに発行済みのID Token の `sub`をJWE の `kid`として指定しなければならない(**MUST**) - 現状、SIOP に対して暗号化したコンテンツを送れるのは `alg=RSA1_5`の時のみである。 ほかのパラメータも用いてよい(**MAY**) 全体URL長は ASCII で 2048文字を超えてはならない(**MUST NOT**) ## 7.4. Self-Issued OpenID Provider Response OIDC では SIOP Response で用いるために以下のClaim を定義する - `sub_jwk` - **REQUIRED** - SIOPから発行されたID Tokenの署名検証に使われる公開鍵 - **JWK** - X.509ではないので注意 - SIOPでない場合は使うのを推奨しない(**NOT RECOMENDDED**) SIOP のレスポンスは通常の Implicit Flow のレスポンスに以下の改変をしたものと同じである。 - `iss`が https://self-issued.me である - `sub_jwk` Claimが存在し、 ID Token の署名検証のための公開鍵となっている - `sub`の値は`sub_jwk`に含まれる鍵の thumbprint を b64 encode したものとなっている。 - thumbprintは以下の手順で求まる 1. JWKのメンバーのうち、REQUIREDなもののみをメンバー名の辞書順にソート 2. 空白・改行を除き、UTF-8のオクテットで表現 3. SHA-256を計算 - これは、[JSON Web Key (JWK) Thumbprint](https://datatracker.ietf.org/doc/html/draft-jones-jose-jwk-thumbprint)に定義されている - UserInfo EndpointへのAccess Tokenは返却されないため、すべてのClaimはID Token の中で返却されなければならない(**MUST**) ## 7.5. Self-Issued ID Token Validation Client は ID Token の検証を以下の手順で行う必要がある(**MUST**) 1. `iss`の値が、https://self-issued.me であることを確認する(**MUST**) - そうでない場合、SIOPではない 2. Authentication Request で送信した`redirect_uri`が`aud`に含まれていることを確認する(**MUS**) 3. JOSE Header の `alg` パラメータを用いて、JWS の署名検証を行う(**MUST**) - 鍵は`sub_jwk` の中の鍵を用いる。 4. `alg` はデフォルトとしては`RS256`であるべきである(**SHOULD**) `ES256`でもよい(**MAY**) 5. `sub`が`sub_jwk`のthumbprintのb64 encodeであることを確認する(**MUST**) 6. 現在時刻が`exp`よりも前であることを確認する(**MUST**) 7. `iat`があまりにも昔である場合は、拒否してよい 8. nonce が Authentication Request で送られた場合、`nonce` Claimが存在し、それがAuthentication Request で送られたものと同じであることを検証する(**MUST**) Client は Replay Attack を防止するため`nonce`の値を検証するべきである(**SHOULD**) ## おまけ より実用的な仕様としてSIOPv2 というのがある これは Verified Presentation(VP) などを利用して、エンドユーザー自身がIDを発行できるようになる、すなわちDecentralized Identifier(DID)の文脈に近くなるものである。 注:僕も全部読めてるわけではないです(読もうと思ったけどVC, VP, DID, SSI...... と依存多すぎて間に合わない) - [Self-Issued OpenID Provider v2 - draft 13](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html) - [OpenID Connect Client-Initiated Backchannel Authentication Flow - Core 1.0](https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html) - [Verifiable Credentials Data Model v1.1](https://www.w3.org/TR/2022/REC-vc-data-model-20220303/#sotd) - [OpenID for Verifiable Presentations - draft 20](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html)