# (OpenID Connect Core 1.0) 9. Client Authentication
###### tags: `oauth2/oidc`
担当::@Ras:
箇所:https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication
[toc maxlevel=5]
このセクションでは、Client Authentication methodsのセットを定義する
Token Endpointを使う際に、Clientが認可サーバーに自身を認証するのに使う
**[MAY]**
Client Registration中は、RP (Client)はClient Authentication methodを登録してもよい。
デフォルトは`client_sectet_basic`
## 5つのClient Authentication methods
### `client_secret_basic`
デフォルト
認可サーバーから`client_secret`値を受け取ったClientは、[OAuth 2.0] Section 2.3.1に従い、HTTPベーシック認証スキーマを用いて認可サーバーに対して自身を認証する
### `client_secret_post`
認可サーバーから`client_secret`値を受け取ったClientは、[OAuth 2.0] Section 2.3.1に従い、リクエストボディにClientの認証情報を含めることで認可サーバーに対して自身を認証する
### `client_secret_jwt`
認可サーバーから`client_secret`値を受け取ったClientは、HMAC SHA-256などのHMAC SHA algorithmを用いてJWTを作成する。
HMAC(Hash-based Message Authentication Code)は、`client_secret`のUTF-8オクテット表現を共有鍵として使用して計算される。
Clientは[OAuth.JWT]と[OAuth.Assertions]に従って自身を認証する。
**[MUST]**
JWTは以下のREQUIRED Claim Valuesを含まなければならない。
**[MAY]**
OPTIONAL Claim Valuesを含んでもよい。
- `iss`
- **[REQUIRED]**
- Issuer
- **[MUST]** OAuth Clientの`client_id`を含む必要がある
- `sub`
- **[REQUIRED]**
- Subject
- **[MUST]** OAuth Clientの`client_id`を含む必要がある
- `aud`
- **[REQUIRED]**
- Audience
- `aud` Claim
- 認可サーバーをaudienceとして指定する
- **[MUST]** 認可サーバーは自身がtokenの意図された利用者であることを検証しなければならない
- **[SHOULD]** audienceは認可サーバーのToken EndpointのURLであるべきである
- `jti`
- **[REQUIRED]**
- JWT ID
- token用のユニークな、識別子、tokenの再利用を防ぐために利用される
- **[MUST]** tokenは再利用の条件が関係者での合意を得られていない限り1回しか使われなければならない
- `exp`
- **[REQUIRED]**
- ID Tokenの有効期限
- **[MUST NOT]** この期限以降にID Tokenを受理してはならない
- `iat`
- **[OPTIONAl]**
- JWTの発行時刻
**[MAY]**
JWTは他のClaimsを含んでもよい。
**[MUST]**
理解できないClaimsは無視しなければならない。
**[MUST]**
authentication tokenは、[OAuth.Assertions]の`client_assertion`パラメータの値として送られなければならない。
**[MUST]**
[OAuth.Assertions]の`client_assertion_type`パラメータの値は、[OAuth.JWT]の通り`"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"`でなければならない。
### `private_key_jwt`
公開鍵を登録したClientは、その鍵を使ってJWTを署名する。
Clientは[OAuth.JWT]と[OAuth.Assertions]に従って自身を認証する。
**[MUST]**
JWTは以下のREQUIRED Claim Valuesを含まなければならない。
**[MAY]**
OPTIONAL Claim Valuesを含んでもよい。
- `iss`
- `sub`
- `aud`
- `jti`
- `exp`
- `iat`
**[MAY]**
JWTは他のClaimsを含んでもよい。
**[MUST]**
理解できないClaimsは無視しなければならない。
**[MUST]**
authentication tokenは、[OAuth.Assertions]の`client_assertion`パラメータの値として送られなければならない。
**[MUST]**
[OAuth.Assertions]の`client_assertion_type`パラメータの値は、[OAuth.JWT]の通り`"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"`でなければならない。
例
```plaintext
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=i1WsRn1uB1&
client_id=s6BhdRkqt3&
client_assertion_type=
urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&
client_assertion=PHNhbWxwOl ... ZT
```
### `none`
Clientは、Token Endpointでは自身を認証しない。
- Implicit Flow(Token Endpointを使わない)しか使わないから
- または、Client Secretや他の認証メカニズムを持たないPublic Clientであるから
[OAuth 2.0]: https://openid.net/specs/openid-connect-core-1_0.html#RFC6749
[OAuth.JWT]: https://openid.net/specs/openid-connect-core-1_0.html#OAuth.JWT
[OAuth.Assertions]: https://openid.net/specs/openid-connect-core-1_0.html#OAuth.Assertions