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

> JWT で保護された認可リクエスト (JAR) を認可コードフローで使用する方法を説明します。

# JWT で保護された認可リクエスト (JAR) を使用した認可コードフロー

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Highly Regulated Identity 機能を利用するには、Highly Regulated Identity のアドオンを含む Enterprise プランが必要です。詳細については、[Auth0 Pricing](https://auth0.com/pricing/) を参照してください。
</Callout>

[JWT-Secured Authorization Request (JAR)](https://datatracker.ietf.org/doc/html/rfc9101) は、認可リクエストのパラメーターの完全性と真正性を保護するための OAuth 2.0 プロトコル拡張です。パラメーターを署名付きの [JSON Web Token (JWT)](/docs/ja-jp/secure/tokens/json-web-tokens) でまとめることで、中間者による機密性の高いリクエストデータの改ざんや閲覧を防ぐことができます。

<div id="prerequisites">
  ## 前提条件
</div>

JAR を使用する前に、以下を行う必要があります。

1. [RSA キーペアを生成する](/docs/ja-jp/secure/application-credentials/generate-rsa-key-pair)
2. [JWT で保護された認可リクエストを設定する](/docs/ja-jp/get-started/applications/configure-jar) に記載されている手順に従って、公開キーを Auth0 Dashboard にアップロードして登録する

<div id="how-it-works">
  ## 仕組み
</div>

`scope` や `redirect_uri` などのパラメーターを URL 内で平文として渡す代わりに、クライアントアプリケーションはそれらをリクエストオブジェクトとして署名付きの [JSON Web Token (JWT) ](/docs/ja-jp/secure/tokens/json-web-tokens) に格納します。

* 署名: クライアントアプリケーションは秘密キーを使って JWT に署名します。
* 検証: Auth0 Authorization Server は JWT を受け取り、登録済みの公開キーを使って署名を検証します。
* 処理: JWT が有効であれば、Auth0 Authorization Server はそこからパラメーターを取り出します。JAR とクエリ文字列の両方に同じパラメーターがある場合は、JAR 内の値が優先されます。

<div id="generate-the-jar-request">
  ## JAR リクエストを生成する
</div>

お好みの言語で<Tooltip tip="JSON Web Token（JWT）: 2者間でクレームを安全に表現するために使用される標準的な ID トークン形式（多くの場合、アクセストークンの形式としても使用されます）。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=JWT">JWT</Tooltip>を生成するには、[Auth0 JWT ライブラリ](https://jwt.io/libraries) を使用します。

<div id="header">
  ### ヘッダー
</div>

JWT ヘッダーは、検証に使用するキーとアルゴリズムを Auth0 に示します。次のパラメーターを含める必要があります。

* `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 の署名を検証します。

<div id="payload">
  ### ペイロード
</div>

ペイロードには認可パラメーターが含まれます。次のクレームを含める必要があります。

* `iss`: アプリの `client_id` を指定する必要があります
* `aud`: プロトコルと末尾のスラッシュを含むテナントのドメインを指定する必要があります。たとえば、`https://{YOUR_DOMAIN}.auth0.com/` です

JWT には、`/authorize` の呼び出しに必要な必須パラメーターもすべて含める必要があります。たとえば、次のとおりです。

* `client_id`: これにもアプリの `client_id` を指定する必要があります
* `response_type`: 実行する <Tooltip tip="OAuth 2.0: 認可プロトコルとワークフローを定義する認可フレームワーク。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=OAuth+2.0">OAuth 2.0</Tooltip> フローを Auth0 に示します。認可コードグラントフローには `code` を使用します。

JWT には、要求している<Tooltip tip="Authorization Flow: OAuth 2.0 フレームワークで指定される認可グラント（またはワークフロー）。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=authorization+flow">認可フロー</Tooltip>の任意のパラメーター (`audience`、`scope`、`state`、`redirect_uri` など) を含めることもできます。

さらに、JWT には次の任意のクレームを含めることができます。

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

<div id="code-sample-generate-and-sign-jar">
  ## コード例: JAR を生成して署名する
</div>

次の Node.js の例では、[jsonwebtoken ライブラリ](https://www.npmjs.com/package/jsonwebtoken?activeTab=readme) を使用して JAR を生成し、署名します。

```javascript lines expandable 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/', // テナントのドメイン
  client_id,
  response_type: "code",
  scope: "openid profile",
  redirect_uri : "https://myapp.com/callback", // アプリのコールバックURL
  nonce
},
privateKey,
{
  keyid: '{YOUR_KID}', // 公開キーのキーID（kid）の値（省略可能）
  algorithm: 'RS256',
  header: {
    typ: 'oauth-authz-req+jwt',
  },
});

console.log(requestObject);
```

<div id="call-the-authorization-endpoint">
  ## 認可エンドポイントを呼び出す
</div>

JAR は、次のいずれかの方法で Auth0 Authorization Server に送信できます。

1. [標準の JAR リクエスト](#standard-jar-request): 署名付き JWT を、リクエストパラメーターで URL エンコードした文字列として渡します。
2. [プッシュ型認可リクエスト](#pushed-authorization-request): セキュリティを強化し、URL 長の制限を回避するには、PAR を使用します。

<div id="standard-jar-request">
  ### 標準のJARリクエスト
</div>

標準のJARリクエストを使用して`/authorize`エンドポイントを呼び出すには:

1. 新しいブラウザーウィンドウを開きます。
2. <Tooltip tip="Client ID: Auth0 から登録済みリソースに付与される識別値です。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=Client+ID">クライアントID</Tooltip> を `client_id` パラメーターに、署名してURLエンコードしたJWTを `request` パラメーターに指定します。

```bash lines theme={null}
# MacOS
open "https://{YOUR_DOMAIN}.auth0.com/authorize?client_id={YOUR_CLIENT_ID}&request={URL_ENCODED_JWT}"

# Windows
explorer "https://{YOUR_DOMAIN}.auth0.com/authorize?client_id={YOUR_CLIENT_ID}&request={URL_ENCODED_JWT}"
```

<div id="pushed-authorization-request">
  ### プッシュ型認可リクエスト
</div>

プッシュ型認可リクエストを使用して `/authorize` エンドポイントを呼び出すには、次の手順に従います。

1. バックチャネルの `POST` リクエストで、JAR を `/oauth/par` エンドポイントに送信します。
2. Auth0 から `request_uri` が返されるので、それを使用して [通常の PAR フロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/authorization-code-flow/authorization-code-flow-with-par) と同様に `/authorize` エンドポイントを呼び出せます。

次の cURL リクエストでは、PAR と JAR を組み合わせて使用しています。

```bash lines theme={null}
curl --location 'https://{YOUR_DOMAIN}.auth0.com/oauth/par' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={YOUR_CLIENT_ID}' \
--data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
--data-urlencode 'request={JWT}'
```

<div id="learn-more">
  ## 詳細はこちら
</div>

* [JWTで保護された認可リクエスト (JAR) を設定する](/docs/ja-jp/get-started/applications/configure-jar)
