> ## Documentation Index
> Fetch the complete documentation index at: https://developers.authlete.com/llms.txt
> Use this file to discover all available pages before exploring further.

# client_secret_jwt によるクライアント認証

> クライアント認証におけるclient_secret_jwtの処理とAuthleteの設定手順について説明されている。

<Note>
  This page is for **Authlete 2.x**. For current (3.0) documentation, see [this page](/ja/configuration-reference/endpoints/client-authentication-using-client-secret-jwt-method).
</Note>

# client\_secret\_jwt によるクライアント認証

## 概要

**client\_secret\_jwt** はクライアント認証方式のひとつです。[OpenID Connect Core 1.0, 9. Client Authentication](http://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication)
にて定義されています。

トークンリクエストにおいて、クライアントはメッセージ認証コード (MAC; Message Authentication Code) を署名部に含む JWT 形式のアサーションを生成し、リクエストに含めます。そして認可サーバーは、そのアサーションの署名とペイロードを検証し、クライアント認証を行います。

アサーションとして送信する JWT には署名・ペイロードに関していくつかの要件が定められており、認可サーバー側ではこの検証を行う必要があります。

認可サーバーは、client\_secret\_jwt 方式を用いたクライアント認証の処理を、Authlete に移管することができます。本記事ではこの方式の概要と、Authlete の設定手順について説明します。\\

<img src="https://mintcdn.com/authlete/NmFoIJ4VSX_LOgob/img/kb/ja/oauth-and-openid-connect/client-authentication/client-secret-jwt_ja.png?fit=max&auto=format&n=NmFoIJ4VSX_LOgob&q=85&s=91aacd1eb2918146169ee4e97cd4747b" alt="client-secret-jwt_ja" width="960" height="382" data-path="img/kb/ja/oauth-and-openid-connect/client-authentication/client-secret-jwt_ja.png" />

> 本機能は Authlete 2.0 以降でのみ利用可能になります。

## client\_secret\_jwt の処理

クライアント側と認可サーバー側に必要となる処理は、それぞれ下記の通りです。

## クライアント側の処理

client\_secret\_jwt 方式を用いる場合、クライアントはトークンリクエストに以下のパラメーターを含める必要があります。

| パラメーター                  | 説明                                                                                               |
| ----------------------- | ------------------------------------------------------------------------------------------------ |
| client\_assertion\_type | client\_assertion のタイプ。"**urn:ietf:params:oauth:client-assertion-type:jwt-bearer**" という文字列の指定が必要 |
| client\_assertion       | クライアント認証のための情報を含む JWT。**共通鍵による MAC** が必要。詳細は以下を参照のこと                                             |

**client\_assertion** にはペイロードと署名について以下の要件を満たす JWT を指定します。この JWT の具体例は「JWT アサーションの生成」のセクションをご覧ください。

### ペイロード

下記のうち、必須のクレームを含む必要があります。

| クレーム | 必須  | 説明                                                                              |
| ---- | --- | ------------------------------------------------------------------------------- |
| iss  | YES | この JWT の発行者。値はクライアント ID に一致しなければならない。                                           |
| sub  | YES | この JWT のサブジェクト。値はクライアント ID に一致しなければならない。                                        |
| aud  | YES | この JWT の受け取り手。認可サーバーはこの値が適切なものかどうか検証しなければならない。また、この値はトークンエンドポイントの URI であるべきである。 |
| jti  | YES | この JWT の ID                                                                     |
| exp  | YES | この JWT の有効期限                                                                    |
| iat  | NO  | この JWT の発行日時                                                                    |

### 署名

* 署名は **HMAC-SHA アルゴリズム**  (HS256 など) を用いて計算すること
* 署名計算時には**クライアントシークレット**を共通鍵として利用すること

## 認可サーバー側の処理

認可サーバー側では、リクエストを下記仕様に従って適切に処理することになります。ただし**認可サーバーはこれらの処理をすべて Authlete に委譲できる**ため、ここでは詳細は割愛します。

* [JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants (RFC7523)](https://tools.ietf.org/html/rfc7523)
* [Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants (RFC7521)](https://tools.ietf.org/html/rfc7521)

***

##  Authlete の設定

本セクションでは client\_secret\_jwt 方式に対応するための設定を説明します。Authlete サービスと、同方式によって認証されるクライアントの、両方の設定が必要です。

## Authlete サービスの設定

管理者コンソールから以下のように設定してください。

| タブ | 項目               | 設定内容                         |
| -- | ---------------- | ---------------------------- |
| 認可 | サポートするクライアント認証方式 | **CLIENT\_SECRET\_JWT** を有効化 |

<img src="https://mintcdn.com/authlete/NmFoIJ4VSX_LOgob/img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_1.png?fit=max&auto=format&n=NmFoIJ4VSX_LOgob&q=85&s=1c30b39ae205874da06fd9fe7f75a805" alt="client-auth-client-secret-jwt_1" width="620" height="632" data-path="img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_1.png" />

*認可 タブ*

## クライアントの設定

クライアントアプリ開発者コンソールにアクセスし、以下のように設定してください。

| タブ   | 項目             | 設定内容                                  |
| ---- | -------------- | ------------------------------------- |
| 基本情報 | クライアントタイプ      | **CONFIDENTIAL**                      |
| 認可   | クライアント認証方式     | **CLIENT\_SECRET\_JWT**               |
| 認可   | アサーション署名アルゴリズム | **HS256**, **HS384**, **HS512** のいずれか |

<img src="https://mintcdn.com/authlete/NmFoIJ4VSX_LOgob/img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_2.png?fit=max&auto=format&n=NmFoIJ4VSX_LOgob&q=85&s=53a08f7220753770d7c48a9a21d37bb4" alt="client-auth-client-secret-jwt_2" width="598" height="407" data-path="img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_2.png" />

*基本情報 タブ*

<img src="https://mintcdn.com/authlete/NmFoIJ4VSX_LOgob/img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_3.png?fit=max&auto=format&n=NmFoIJ4VSX_LOgob&q=85&s=4e8bf9984999ed613bc2413748cf6d05" alt="client-auth-client-secret-jwt_3" width="544" height="510" data-path="img/kb/ja/oauth-and-openid-connect/client-authentication/client-auth-client-secret-jwt_3.png" />

*認可 タブ*

***

## 実行例

q
以下は、認可サーバーのトークンエンドポイントにおいて client\_secret\_jwt によるクライアント認証を行う例です。

## JWT アサーションの生成

事前準備として、トークンリクエストに含める **client\_assertion** パラメーターの値 (JWT) を生成します。

### JWT ペイロードの準備

まず JSON 形式のペイロードを生成し、ここでは payload.json というファイル名で保存します。

```
{
   "jti": "myJWTId001",
   "sub": "38174623762",
   "iss": "38174623762",
   "aud": "http://localhost:4000/api/auth/token/direct/24523138205",
   "exp": 1536165540,
   "iat": 1536132708
}
```

### JWT の生成

前述のペイロードと、上記の共通鍵を用いて生成された MAC を、ともに含む JWT を生成します。以下は [authlete-jose ライブラリ](https://github.com/authlete/authlete-jose)
を利用して JWT を生成する例ですが、[mkjose.org](https://mkjose.org/)
サービスなどの他の方法を利用してもかまいません。

```
$ bin/jose-generator \
  --payload-file payload.json \
  --sign \
  --signing-alg HS256 \
  --signing-alg-key TzPTZDtcw9ek41H1VmofRoXQddP5cWCXPWidZHSA2spU6gZN9eIFUiXaHD7OfxtBhTxJsg_I1tdFI_CkKl8t8Q
```

結果的に以下のような JWT が得られます。（見やすさを考慮し一部改行してあります。）

```
eyJhbGciOiJIUzI1NiJ9.
ewogICJqdGkiOiJteUpXVElkMDAxIiwKICAic3ViIjoiMzgxNzQ2MjM3NjIiLAogIC
Jpc3MiOiIzODE3NDYyMzc2MiIsCiAgImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDAw
MC9hcGkvYXV0aC90b2tlbi9kaXJlY3QvMjQ1MjMxMzgyMDUiLAogICJleHAiOjE1Mz
YxNjU1NDAsCiAgImlhdCI6MTUzNjEzMjcwOAp9Cg.
Vin3IxRPMLQ0SKNJ8Ba_59dYHBGLb4Ft-JLbJVKFd3E
```

この JWT が、クライアントがトークンリクエストの際に用いる client\_assertion の値となります。

## トークンリクエストの実行

### クライアントから認可サーバーへのトークンリクエスト

上記のアサーションを持つクライアントが、認可サーバーに対して以下のトークンリクエストを送信したと仮定します。（見やすさを考慮し一部改行してあります）

```
POST /token HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&
code=Gw30fMKJBHkcOBSde5awLrMm4ahvgCNM2cFSTUOUflY&
redirect_uri=https://example.com/redirection&
**client_assertion_type=
 urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&
client_assertion=
 eyJhbGciOiJIUzI1NiJ9.
 ewogICJqdGkiOiJteUpXVElkMDAxIiwKICAic3ViIjoiMzgxNzQ2MjM3NjIiLAogIC
 Jpc3MiOiIzODE3NDYyMzc2MiIsCiAgImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDAw
 MC9hcGkvYXV0aC90b2tlbi9kaXJlY3QvMjQ1MjMxMzgyMDUiLAogICJleHAiOjE1Mz
 YxNjU1NDAsCiAgImlhdCI6MTUzNjEzMjcwOAp9Cg.
 Vin3IxRPMLQ0SKNJ8Ba_59dYHBGLb4Ft-JLbJVKFd3E**
```

### 認可サーバーから Authlete への API リクエスト

認可サーバーは、 Authlete の [/auth/token API](/api-reference/token-endpoint/process-token-request)
に、このリクエストの内容を転送します。（見やすさを考慮し一部改行してあります）

```
$ curl -s -X POST https://api.authlete.com/api/auth/token \
-H 'Content-Type: application/json' \
-u '...:...' \
-d '{
  "parameters":"grant_type=authorization_code&
    code=Gw30fMKJBHkcOBSde5awLrMm4ahvgCNM2cFSTUOUflY&
    redirect_uri=https://example.com/redirection&
    **client_assertion_type=
     urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&
    client_assertion=
     eyJhbGciOiJIUzI1NiJ9.
     ewogICJqdGkiOiJteUpXVElkMDAxIiwKICAic3ViIjoiMzgxNzQ2MjM3NjIiLAogIC
     Jpc3MiOiIzODE3NDYyMzc2MiIsCiAgImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDAw
     MC9hcGkvYXV0aC90b2tlbi9kaXJlY3QvMjQ1MjMxMzgyMDUiLAogICJleHAiOjE1Mz
     YxNjU1NDAsCiAgImlhdCI6MTUzNjEzMjcwOAp9Cg.
     Vin3IxRPMLQ0SKNJ8Ba_59dYHBGLb4Ft-JLbJVKFd3E**}'
```

### Authlete から認可サーバーへの API レスポンス

Authlete は上記リクエストを処理し、API レスポンスとして、認可サーバーに以下を返却します。（見やすさを考慮し一部改行してあります）

```
{
    "type": "tokenResponse",
    "resultCode": "A050001",
    "resultMessage": "[A050001] The token request (grant_type=authorization_code) was processed successfully.",
    "accessToken": "kwXY57oN4nBOqxk57vW2fo-WzgezrwSl2h1N_xW8aKI",
    "responseContent": {
        "access_token": "kwXY57oN4nBOqxk57vW2fo-WzgezrwSl2h1N_xW8aKI",
        "refresh_token": "5zBNsdrlMojcMH3wCrfaXpmAY6vKqOqeV3q1ebRJzGM",
        "scope": null,
        "token_type": "Bearer",
        "expires_in": 3600
    },
    ...
}
```

### 認可サーバーからクライアントへのトークンレスポンス

認可サーバーは "responseContent" から抽出した値を、トークンレスポンスとしてクライアントに返却します。（詳細は割愛）

***

## 参考資料

* [クライアント認証の設定](/ja/configuration-reference/endpoints/configuring-client-authentication)

> 本記事では、Authlete のクライアント認証設定の基本を説明します。

* [private\_key\_jwt によるクライアント認証](/ja/v2/protocols-and-flows/client-authentication/client-auth-private-key-jwt)

> 認可サーバーは、**private\_key\_jwt** 方式を用いたクライアント認証の処理を、Authlete に移管することができます。本記事ではこの方式の概要と、Authlete の設定手順について説明します。

* [OAuth 2.0 クライアント認証 - Qiita](https://qiita.com/TakahikoKawasaki/items/63ed4a9d8d6e5109e401)

> この記事では、OAuth 2.0 の『**クライアント認証**』について説明します。\
> [RFC 6749](https://tools.ietf.org/html/rfc6749)
> に記述されているクライアント認証方式のほか、クライアントアサーションやクライアント証明書を用いるクライアント認証方式についても説明します。
