> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-actions-triggers-prototype.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 秘密鍵JWTで認証する

> 秘密鍵JWT認証を使用するためのアサーションの構築方法について説明します。

<Card title="Before you start">
  まず、Auth0 Dashboardで新しいアプリケーションを作成するか、既存のアプリケーションを変換する必要があります。詳細については、「[秘密鍵JWTの認証を構成する](https://auth0.com/docs/get-started/applications/configure-private-key-jwt)」をお読みください。
</Card>

`private_key_jwt:`で認証をするには、2つの手順を完了する必要があります。

1. クライアントアサーションを構築します。このアサーションはキーペアを生成した際に秘密鍵で署名されたJWTです。キーペア生成の詳細については、「[秘密鍵JWTの認証を構成する](/docs/ja-jp/get-started/applications/configure-private-key-jwt)」をお読みください。
2. Auth0に対してアサーションを使用して認証します。

## アサーションを構築する

Auth0のSDKのいずれかを使用して、アサーションを自動的に構築できます。SDKを使用しない場合、ご自身でアサーションを構築する必要があります。

アサーションとは、以下のプロパティとクレームを含む必要がある<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=json-web-token" tip="JSON Web Token（JWT）: 二者間のクレームを安全に表現するために使用される標準IDトークン形式（および多くの場合、アクセストークン形式）。" cta="用語集の表示">JSON Web Token</Tooltip>（JWT）のことです。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  特に記載のない限り、クレームはすべて必須です。JWTクレームの詳細については、「[JSON Web Tokenクレーム](/docs/ja-jp/secure/tokens/json-web-tokens/json-web-token-claims)」をお読みください。
</Callout>

* ヘッダー

  * `alg`：アサーションの署名に使用されるアルゴリズム。アルゴリズムはアプリケーションの資格情報を作成した際に指定されたアルゴリズムと一致している必要があります。
  * `kid`**：**（任意）Auth0が生成した資格情報の`kid`。`kid`は、資格情報を作成する際に作られます。
* ペイロード

  * `iss`：アプリケーションのクライアントID。この値はアプリケーション設定にあり、[［Auth0 Dashboard］>［Applications（アプリケーション）］>［Applications（アプリケーション］](https://manage.auth0.com/dashboard/#/applications/)に移動して、**［Settings（設定）］** タブを選択すると見つかります。

  * `sub`：アプリケーションのクライアントID。この値もアプリケーション設定で見つけることができます。[［Auth0 Dashboard］>［Applications（アプリケーション）］>［Applications（アプリケーション］](https://manage.auth0.com/dashboard/#/applications/)に移動して、**［Settings（設定）］** タブを選択します。

  * `aud`：アサーションを受け取るAuth0テナントのURLまたはカスタムドメイン。例：`https://{yourTenant}.auth0.com/`。末尾のスラッシュを含めます。

    <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
      Auth0テナントに対してカスタムドメインを構成した場合は、これを`aud`クレームとして使用できます。その場合は、カスタムドメインの使用をお勧めします。
    </Callout>

  * `iat`（任意）と`exp`：「発行日時」と「有効期限」クレームを正しいタイムスタンプで設定します。クライアントのアサーションは、一度限り使用できるトークンで、可能な限り短い有効期限の設定をお勧めします。Auth0はトークンのライフタイムとして最長5分間をサポートします。

  * `jti`：クライアントが作成した一意のクレームID。Universally Unique Identifier（UUID）フォーマットの使用をお勧めします。

    <Warning>
      このJWTは1回のみ使用可能なトークンで、有効期限を短くすることによって有効性にそのような制約を設けます。1分以内に設定することをお勧めします。
    </Warning>

そしてトークンは、秘密鍵JWT認証のためにアプリケーションを作成または構成した際に生成された秘密鍵で署名される必要があります。その方法については、「[JSON Web Tokenの仕様](https://www.rfc-editor.org/rfc/rfc7519#section-7.1)」をご確認ください。

標準ツールやこの機能をサポートするサードパーティライブラリを使用してトークンを構築することを推奨します。ゼロから独自に実装するのは避けてください。サポートしているライブラリの詳細については、[JWT.io](https://jwt.io/libraries)のリストを参照してください。

### 例

以下の例では、Node.jsスクリプトが[joseパッケージ](https://github.com/panva/jose)を使用してアサーションを生成しています。

```javascript lines theme={null}
const { SignJWT } = require('jose')
const crypto = require("crypto");
const uuid = require("uuid");

async function main() {
 const privateKeyPEM = crypto.createPrivateKey(/**
   Read the content of your private key here. We recommend to store your private key
   in a secure infrastructure. 
 */);

 const jwt = await new SignJWT({})
   .setProtectedHeader({ 
      alg: 'RS256', // or RS384 or PS256
      kid: '(OPTIONAL) KID_GENERATED_BY_AUTH0' 
   })
   .setIssuedAt()
   .setIssuer('CLIENT_ID')
   .setSubject('CLIENT_ID')
   .setAudience('https://YOUR_TENANT.auth0.com/') // or your CUSTOM_DOMAIN
   .setExpirationTime('1m')
   .setJti(uuid.v4())
   .sign(privateKeyPEM);
  console.log(jwt)
}

main();
```

秘密鍵で署名したクライアントアサーションの例

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/lj4yKtFBkRd_2GRB/docs/images/ja-jp/cdy7uua7fh8z/4O8zb1gZnEmUQ6FrRkfmlc/a30b73e09d51ca0b4bf929b91571a80a/2023-03-13_16-53-54.png?fit=max&auto=format&n=lj4yKtFBkRd_2GRB&q=85&s=756ba1f911d98a96eb4564110e1252b5" alt="private key example" width="1256" height="400" data-path="docs/images/ja-jp/cdy7uua7fh8z/4O8zb1gZnEmUQ6FrRkfmlc/a30b73e09d51ca0b4bf929b91571a80a/2023-03-13_16-53-54.png" />
</Frame>

以下に対応しています。

```json lines theme={null}
{
  "alg": "RS256",
  "kid": "my kid"
}
{
  "iat": 1626684584,
  "iss": "my client id",
  "sub": "my client id",
  "aud": "https://mytenant.auth0.com/",
  "exp": 1626684644,
  "jti": "e4dc8ed1-b108-4901-8bbc-c07a791817e7"
}
```

必要な情報でJWTを生成したら、Auth0に対してアプリケーションを認証する準備が整います。

## アサーションをアクセストークンと交換する

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  以下の例では、[クライアントの資格情報フロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/client-credentials-flow)を使用しています。秘密鍵JWTでの認証は、`client_secret`を`client_assertion`で置き換えることを許可している他の付与タイプにも使用できます。
</Callout>

JWTアサーションをアクセストークンと交換するには、以下のパラメーターで認証APIの[トークンエンドポイント](https://auth0.com/docs/api/authentication#authenticate-user)を呼び出します。

* `$client_assertion`：JWTアサーション
* `$resource_server_identifier`：リソースサーバーの識別子。詳細については、「[APIを登録する](/docs/ja-jp/get-started/auth0-overview/set-up-apis)」お読みください。

```bash lines theme={null}
curl --location --request POST 'https://$tenant/oauth/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=client_credentials' \
  --data-urlencode 'client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer' \
  --data-urlencode 'client_assertion=$client_assertion' \
  --data-urlencode 'audience=$resource_server_idenifier'
```

## サポートされているエンドポイント

[https://\$tenant/oauth/token](https://auth0.com/docs/api/authentication#get-token)エンドポイントに加え、以下のAuth0 Authentication APIエンドポイントは、構成済みアプリケーションの`private_key_jwt`認証をサポートしています。

* [POST /oauth/revoke](https://auth0.com/docs/api/authentication#revoke-refresh-token)
* [POST /mfa/challenge](https://auth0.com/docs/api/authentication#challenge-request)
* [POST /passwordless/start](https://auth0.com/docs/api/authentication#get-code-or-link)

## アサーションの制限

JWTアサーションの最大長は2048バイトです。

アサーション内のクレームには次の制限があります。

* `iss`：64文字
* `sub`：64文字
* `jti`：64文字
* `alg`：16文字
