# (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)