88 views
# (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