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

# JWT-Secured Authorization Requests（JAR）を使った認可コードフロー

> 認可コードフローでJWTで保護された認可要求（JAR）を使用する方法を説明します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  ハイリーレギュレーテッドアイデンティティ機能を使用するには、エンタープライズプランとハイリーレギュレーテッドアイデンティティアドオンが必要です。詳細については、「[Auth0の価格設定](https://auth0.com/pricing/)」を参照してください。
</Callout>

[JWTで保護された認可要求（JAR）](https://datatracker.ietf.org/doc/html/rfc9101)は、OAuth2プロトコルの拡張であり、認可要求パラメータの整合性を保護するためにセキュリティレイヤーを追加します。

## 前提条件

JARを使用するには、まず[RSAキーペアを生成する](/docs/ja-jp/secure/application-credentials/generate-rsa-key-pair)必要があります。次に、[JWTで保護された認可要求の構成](/docs/ja-jp/get-started/applications/configure-jar)の説明に従って、公開鍵をAuth0に登録します。

認可コードフロー中に、クライアントアプリケーションは`/authorize`または`/oauth/par`エンドポイントに送信するパラメーターを取得し、それらを[JSON Webトークン （JWT）](/docs/ja-jp/secure/tokens/json-web-tokens)にラップして、秘密鍵を使用して署名します。

認可サーバーは、アプリケーションの公開鍵を使用して署名を検証します。署名が有効な場合、認可サーバーは JARから要求パラメータを抽出し、通常どおり要求を処理します。その結果、パラメータ値は既知のソースから取得されることが保証され、仲介者によって改ざんされたりアクセスされたりすることはできません。

## JAR要求を生成する

JAR要求を生成するには、まず [JSON Webトークン（JWT）](/docs/ja-jp/secure/tokens/json-web-tokens)を作成する必要があります。[Auth0 JWTライブラリ](https://jwt.io/libraries)を使用すると、好みの言語で<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-3" href="/docs/ja-jp/glossary?term=json-web-token" tip="JSON Web Token（JWT）: 二者間のクレームを安全に表現するために使用される標準IDトークン形式（および多くの場合、アクセストークン形式）。" cta="用語集の表示">JWT</Tooltip>を生成できます。

### ヘッダー

JAR要求の場合、JWTヘッダーには次のフィールドが含まれている必要があります：

* `alg`：JWTに署名するために使用されるアルゴリズム。RS256、RS384、またはPS256のいずれかである必要があります。
* `typ`：JWTの種類です。`jwt`または`oauth-authz-req+jwt`のいずれかである必要があります。

ヘッダーには、JWTの署名に使用されるキーを識別する`kid`フィールドも含まれる場合があります。`kid` が存在する場合、Auth0は[JAR構成](/docs/ja-jp/get-started/applications/configure-jar)中に登録された、一致するキーIDを持つ公開鍵を探し、そのキーを使用してJWTの署名を検証します。

### ペイロード

JWTペイロードには次のクレームが含まれている必要があります：

* `iss`：これにはアプリの`client_id`が含まれている必要があります
* `aud`：これは、プロトコルと末尾のスラッシュが付いたテナントのドメインである必要があります。例えば、`https://your_domain.auth0.com/`

JWTには、`/authorize`の呼び出しに必要なパラメータも含まれている必要があります。例：

* `client_id`：これにはアプリの`client_id`も含まれている必要があります
* `response_type`：Auth0に、実行する<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-1" href="/docs/ja-jp/glossary?term=oath2" tip="OAuth 2.0: 認可プロトコルとワークフローを定義する認可フレームワーク。" cta="用語集の表示">OAuth 2.0</Tooltip>フローを示します。認可コード付与フローに`code`を使用します。

JWTには、`audience`、`scope`、`state`、`redirect_uri`など、要求されている認可フローのオプションパラメータが含まれる場合があります。

さらに、JWTには次のオプションのクレームが含まれる場合があります：

* `iat`：数値の日付である必要があります。
* `nbf`：過去の時間を表す数値の日付である必要があります。
* `exp`：将来の時刻を表す数値の日付である必要があります。
* `jti`：64バイト以下の文字列である必要があります。

### JWTの生成例

次のJavaScriptコードサンプルは、JavaScriptおよび[jsonwebtokenライブラリ](https://www.npmjs.com/package/jsonwebtoken?activeTab=readme)を使用してJWTを構築および署名する方法を示しています。生成されたJWTをコンソールに出力します：

```javascript lines theme={null}
const jwt = require('jsonwebtoken');
const crypto = require("crypto");
const fs = require('fs');

const privateKey = fs.readFileSync('[PATH TO YOUR PEM FILE]');
const client_id = '[YOUR CLIENT ID]';
const nonce = crypto.randomBytes(16).toString('hex');

const requestObject = jwt.sign(
{
  iss: client_id,    
  aud: 'https://your_tenant.auth0.com/', // your tenant's domain
  client_id,
  response_type: "code",
  scope: "openid profile",
  redirect_uri : "https://myapp.com/callback" // your app's callback URL
  nonce
},
privateKey,
{
  keyid: '[YOUR KID]', // optional key id (kid) value from your public key
  algorithm: 'RS256',
  header: {
    typ: 'oauth-authz-req+jwt',
  },
});

console.log(requestObject);
```

### 認可エンドポイントを呼び出す

署名されたJWTを使用して`/authorize`エンドポイントを呼び出すには、新しいブラウザウィンドウを開きます。クライアントIDを`client_id`パラメータとして渡し、署名およびURLエンコードされたJWTを`request`パラメータとして渡します。

```lines theme={null}
# MacOS
open "https://your_tenant.auth0.com/authorize?client_id=[YOUR CLIENT ID]&request=[URL ENCODED JWT]"

# Windows
explorer "https://your_tenant.auth0.com/authorize?client_id=[YOUR CLIENT ID]&request=[URL ENCODED JWT]"
```

## もっと詳しく

* [JAR（JWT-Secured Authorization Request）を構成する](/docs/ja-jp/get-started/applications/configure-jar)
