> ## 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.

# Authlete を使って FAPI 2.0 メッセージ署名プロファイル: 認可レスポンスの署名をサポートする

> Authlete を使って FAPI 2.0 メッセージ署名プロファイル: 認可レスポンスの署名をサポートする。

<Note>
  このページは **Authlete 3.x** 用です。2.x のドキュメントは[こちら](/ja/v2/protocols-and-flows/compliance-profiles/supporting-fapi-2-0-message-signing-profile-signing-authorization-responses)をご覧ください。
</Note>

## 概要

本ドキュメントでは、Authlete を利用して [FAPI 2.0 メッセージ署名プロファイル: 認可レスポンスの署名](https://openid.net/specs/fapi-message-signing-2_0-final.html#name-signing-authorization-respo) (以降、"FAPI 2.0 認可レスポンス署名"と呼称) をサポートする方法について解説します。

<Note>
  FAPI 2.0 認可レスポンス署名は Authlete 2.3 以降で利用可能です。
</Note>

<Note>
  FAPI 2.0 認可レスポンス署名では、FAPI 2.0 セキュリティプロファイルに規定される全要件を満たす必要があります。
</Note>

## 前提条件

* 本ドキュメントでは、認可コードフローを例に解説を行います。
* クライアント認証には `private_key_jwt` が使用されます。
* アクセストークンの送信者制限メカニズムとして DPoP が使用されます。

<img src="https://mintcdn.com/authlete/oZd1VUaYFwHO2MBx/protocols-and-flows/compliance-profiles/authz-code-flow-ja.png?fit=max&auto=format&n=oZd1VUaYFwHO2MBx&q=85&s=4ebc525e9780bad89b370955c8388203" width="2274" height="1272" data-path="protocols-and-flows/compliance-profiles/authz-code-flow-ja.png" />

## サービスの設定

以下のようにサービスを設定してください。

### ☑️ 基本設定 > 発行者識別子

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-issuer-identifier-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=60822dbc2d53a8faab6b93ee83efa987" width="2058" height="336" data-path="protocols-and-flows/compliance-profiles/v30-service-issuer-identifier-ja.png" />

認可サーバーの識別子 (issuer) を設定します。

### ☑️ 基本設定 > 指定可能なサービスプロファイル (任意)

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-service-fapi-profile-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=62a75edaee3ff47c10ad839db00d0b75" width="2058" height="308" data-path="protocols-and-flows/compliance-profiles/v30-service-fapi-profile-ja.png" />

有効にします。

### ☑️ エンドポイント > 基本設定 > サポート可能なグラントタイプ

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-supported-grant-types-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=fc83c880e0002126af732b73e31fc511" width="2058" height="768" data-path="protocols-and-flows/compliance-profiles/v30-service-supported-grant-types-ja.png" />

`AUTHORIZATION_CODE` を含めます。

### ☑️ エンドポイント > 基本設定 > サポート可能なレスポンスタイプ

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-supported-response-types-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=08187fb6f3d3ff071baca582053b53e2" width="2062" height="694" data-path="protocols-and-flows/compliance-profiles/v30-service-supported-response-types-ja.png" />

`CODE` を含めます。

### ☑️ エンドポイント > 認可 > 認可エンドポイントURL

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-service-authorization-endpoint-url-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=ea7e4544804f399d4e20c466195818c4" width="2058" height="304" data-path="protocols-and-flows/compliance-profiles/v30-service-authorization-endpoint-url-ja.png" />

認可エンドポイントの URI を設定します。

### ☑️ エンドポイント > 認可 > 発行者識別レスポンスパラメーター

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-issuer-identification-response-parameter-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=6b29e681be2f4a8e2455972d08d6ab80" width="2070" height="326" data-path="protocols-and-flows/compliance-profiles/v30-service-issuer-identification-response-parameter-ja.png" />

本設定は無効にします。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows"

7. \[RFC9207] に従って、認可レスポンスに iss レスポンスパラメーターを含めなければならない。

### ☑️ エンドポイント > 認可 > ループバックリダイレクト URI

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-loopback-redirection-uri-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=d7cf8d3651f37149578cccb8f9be770d" width="2064" height="326" data-path="protocols-and-flows/compliance-profiles/v30-service-loopback-redirection-uri-ja.png" />

本設定は有効にします。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows"

8. 暗号化されていないネットワーク接続を介して認可レスポンスを送信しないこと、及びこの目的で http スキームを使用するリダイレクト URI を許可してはならない。ただし \[RFC8252] セクション 7.3 に記述されたループバックインターフェースリダイレクションを使用するネイティブクライアントについてはこの限りではない。

### ☑️ エンドポイント > トークン > トークンエンドポイントURL

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-token-endpoint-url-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=fe8b19853b63db1bc578b552dcd75aa8" width="2070" height="306" data-path="protocols-and-flows/compliance-profiles/v30-service-token-endpoint-url-ja.png" />

トークンエンドポイントの URI を設定します。

### ☑️ エンドポイント > トークン > サポート可能なクライアント認証方式

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-supported-client-authentication-methods-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=007c328aef2f9d6ba566b57213bf44b2" width="2058" height="692" data-path="protocols-and-flows/compliance-profiles/v30-service-supported-client-authentication-methods-ja.png" />

`PRIVATE_KEY_JWT` を選択します。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements"

6. クライアント認証は以下のいずれかを利用しなければならない:

>

* \[RFC8705] のセクション 2 に規定される MTLS

>

* \[OIDC] のセクション 9 に規定される private\_key\_jwt

### ☑️ エンドポイント > トークン > クライアントアサーションに含まれる aud クレームの値

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-service-assertion-audience-mode-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=4de1823bf9402ec5f5202e20a42663a0" width="2068" height="378" data-path="protocols-and-flows/compliance-profiles/v30-service-assertion-audience-mode-ja.png" />

本設定は有効にします。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements"

8. クライアントアサーションの aud クレームに含まれる値は、文字列型かつ認可サーバーの発行者識別子 (\[RFC8414] にて規定) の値でなければならない。

### ☑️ エンドポイント > 一般 > プッシュ式認可リクエスト（PAR）

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-pushed-authorization-request-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=c27cbf49edf195602d7f8a697fc47611" width="2056" height="592" data-path="protocols-and-flows/compliance-profiles/v30-service-pushed-authorization-request-ja.png" />

* **PAR エンドポイントの URL** を設定します。
* **PAR エンドポイントの有効期間** (リクエスト URI の有効期間) に 600 秒未満の値を設定します。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows"

12. プッシュ式認可リクエストに対して発行される request\_uri は expires\_in の値が 600 秒未満でなければならない。

### ☑️ トークン＆クレーム > リフレッシュトークン > リフレッシュトークンローテーション

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-refresh-token-rotation-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=6ad72b5881f2bfa59fbf9c5707c80415" width="2068" height="730" data-path="protocols-and-flows/compliance-profiles/v30-service-refresh-token-rotation-ja.png" />

トークンローテーションは無効にします。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements"

9. 例外的な状況を除いて、リフレッシュトークンのローテーションは使用してはならない。(NOTE 1 を参照)

> ...
>
> NOTE 1: コンフィデンシャルクライアントと送信者制限されたアクセストークンが併用される場合、リフレッシュトークンのローテーションはセキュリティ上のメリットをもたらさない。本仕様では、リフレッシュトークンのローテーションをセキュリティ上の理由から禁止する。これは、クライアントが新しいリフレッシュトークンの保存や受理に失敗した場合に再試行する手段がなく、ユーザー体験（UX）の劣化や運用上の問題を引き起こすためである。
>
> もっとも、インフラ移行などの例外的な状況ではリフレッシュトークンのローテーションが必要となる場合もある。そのため、クライアントが新しいリフレッシュトークンの保存・受理に失敗した場合に、一定期間内で古いリフレッシュトークンを使って再試行できる仕組みを認可サーバーが提供している場合には、リフレッシュトークンのローテーションは許容される。実装者は、クライアントが新しいリフレッシュトークンを失ってしまった状態から安全にリカバリーする仕組みついて検討する必要があるが、そのような仕組みの詳細については本仕様の対象外とする。

### ☑️ トークン＆クレーム > ID トークン

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-service-allowable-clock-skew-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=0824bfcd4abad2cdb44c00684998dd10" width="2062" height="750" data-path="protocols-and-flows/compliance-profiles/v30-service-allowable-clock-skew-ja.png" />

以下の条件を満たすクロックスキューを設定します:

```
10 秒 ≤ クロックスキュー ≤ 60 秒
```

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements"

13. 時刻のずれに対応するために、JWT に含まれる iat または nbf の値が現在時刻より 0〜10 秒先の値であっても、その JWT を受け入れなければならない。ただし、現在時刻より 60 秒を超える値が設定されている場合は、その JWT を拒否しなければならない。詳細およびその理由については NOTE 3 を参照のこと。

> ...
>
> NOTE 3: クロックスキュー (時刻のずれ) は相互運用性に関わる様々な問題を引き起こす原因となる。数百ミリ秒のクロックスキューですら、JWT が「将来に発行されたものである」と見なされリジェクトされる原因となる。DPoP の仕様 \[RFC9449] によれば、JWT が将来のタイムスタンプを持っていても、それが秒や分の単位であれば、その JWT は受理されることが推奨される。本仕様ではさらに踏み込んで、認可サーバーは最大 10 秒先のタイムスタンプを持つ JWT を受理しなければならないとしている。10 秒という値は、セキュリティを損なわず、かつ、相互運用性を大きく向上させる値として選定されている。実装者は、最大 60 秒先のタイムスタンプを持つ JWT を受理することも可能である。いくつかのエコシステムでは、クロックスキュー問題を解決するために 30 秒という値が必要であることも分かっている。実装上 iat と nbf の検証が完全に無効になってしまうのを防ぐために、本仕様ではタイムスタンプの上限を 60 秒先までと定めている。

### ☑️ トークン＆クレーム > 詳細 > スコープ

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-supported-scopes-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=dc04035e30f2130f9e0a171fb8865e60" width="2068" height="800" data-path="protocols-and-flows/compliance-profiles/v30-service-supported-scopes-ja.png" />

<img src="https://mintcdn.com/authlete/UdhsyS8JFpC2EXja/protocols-and-flows/compliance-profiles/v30-service-supported-scopes-create-scope-ja.png?fit=max&auto=format&n=UdhsyS8JFpC2EXja&q=85&s=b02da756c590effc568bfc72c24a5886" width="1068" height="1454" data-path="protocols-and-flows/compliance-profiles/v30-service-supported-scopes-create-scope-ja.png" />

以下の条件でスコープを作成します。

* スコープ名: `myscope`
* スコープのプロパティ: キー = `fapi2`、値 = `ms-authres`

## クライアントの設定

以下のようにクライアントを設定してください。

### ☑️ 基本設定 > クライアントタイプ

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-client-type-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=7246173fe91c95becc7ee642464c4760" width="2034" height="308" data-path="protocols-and-flows/compliance-profiles/v30-client-client-type-ja.png" />

`機密`を選択します。

### ☑️ エンドポイント > 基本設定 > サポート可能な認可タイプ

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-supported-grant-types-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=e0d56bdc03729722af13a1a1097ca5aa" width="2030" height="776" data-path="protocols-and-flows/compliance-profiles/v30-client-supported-grant-types-ja.png" />

`AUTHORIZATION_CODE` を含めます。

### ☑️ エンドポイント > 基本設定 > サポート可能なレスポンスタイプ

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-supported-response-types-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=32ba00bcf16312237b89b1b8f20e32f9" width="2028" height="698" data-path="protocols-and-flows/compliance-profiles/v30-client-supported-response-types-ja.png" />

`CODE` を含めます。

### ☑️ エンドポイント > 基本設定 > リダイレクトURI

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-redirect-uris-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=06510fc5c7073b4d6d3902327b7ea5dc" width="2034" height="504" data-path="protocols-and-flows/compliance-profiles/v30-client-redirect-uris-ja.png" />

`https` で始まるリダイレクト URI を登録します。

### ☑️ エンドポイント > トークン > クライアント認証方式

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-client-authentication-method-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=b056e4351c42ff2ba4ad2f583436b2c4" width="2028" height="280" data-path="protocols-and-flows/compliance-profiles/v30-client-client-authentication-method-ja.png" />

`PRIVATE_KEY_JWT` を選択します。

> "FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.1. General requirements"

2. 以下のいずれかまたは両方を使用してクライアント認証をサポートしなければならない:

>

* \[RFC8705] のセクション 2 で指定される MTLS

>

* \[OIDC] のセクション 9 で指定される private\_key\_jwt

### ☑️ エンドポイント > トークン > アサーション署名アルゴリズム

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-assertion-signature-algorithm-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=23339f3e1062e802f254d3fa4d4258e0" width="2032" height="342" data-path="protocols-and-flows/compliance-profiles/v30-client-assertion-signature-algorithm-ja.png" />

`ES256` を選択します。

> "FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements"

1. JWT を作成または処理する際、認可サーバー・クライアント・リソースサーバーは、以下に従わなければならない

> <ol>
>   <li>
>     \[RFC8725] に準拠すること
>   </li>
>
>   <li>
>     `PS256`、`ES256`、または (`Ed25519` 形式を使用する) `EdDSA` アルゴリズムのいずれかを使用すること; そして
>   </li>
>
>   <li>
>     `none` アルゴリズムの使用・受理を禁止すること
>   </li>
> </ol>

### ☑️ キーマネジメント > JWKセット > JWKセットの内容

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/v30-client-jwks-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=cf80b4a927fae6553721608ea02a3efc" width="2028" height="616" data-path="protocols-and-flows/compliance-profiles/v30-client-jwks-ja.png" />

JWK セットを設定します。今回の設定例では `private_key_jwt` を使用するため、JWK セットにはクライアントアサーション用の署名鍵を含める必要があります。JWK セットに含める鍵群は下記要件を満たす必要があることに注意してください。

> "FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements"

2. RSA キーは最低 2048 ビットの長さでなければならない。

>

3. EC キーは最低 224 ビットの長さでなければならない。

## 動作確認

本セクションでは、FAPI 2.0 認可レスポンス署名に準拠した認可コードフローの動作確認を行います。

### 1. プッシュ式認可リクエスト (PAR リクエスト)

<img src="https://mintcdn.com/authlete/U02sYmcLE8xIcCKt/protocols-and-flows/compliance-profiles/par-req-and-res-cropped-ja.png?fit=max&auto=format&n=U02sYmcLE8xIcCKt&q=85&s=202a331a2f4722cfc01519ed482e7eec" width="2236" height="728" data-path="protocols-and-flows/compliance-profiles/par-req-and-res-cropped-ja.png" />

最初に、クライアントは認可サーバーへプッシュ式認可リクエスト (PAR リクエスト) を送信します。この際、以下の要件が必要となります。

### ☑️ クライアント認証

上記で設定した通り、PAR エンドポイントでのクライアント認証には `private_key_jwt` が利用されます。

### ☑️ スコープ

`scope` リクエストパラメーターには `myscope` をセットします。

### ☑️ レスポンスタイプ

`response_type` リクエストパラメーターの値は `code` にセットします。

> "FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.2. Authorization code flow"

1. \[RFC6749] で説明されている認可コードグラントを使用しなければならない。

### ☑️ PKCE

`code_challenge` リクエストパラメーターをセットし、`code_challenge_method` リクエストパラメーターには `S256` をセットします。

> "FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.2. Authorization code flow"

3. PKCE \[RFC7636] を使用し、コードチャレンジメソッドとして S256 を設定しなければならない。

### ☑️ リダイレクト URI

`redirect_uri` リクエストパラメーターには、クライアントの設定で登録した URI をセットします。

> "FAPI2 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows"

6. プッシュ式認可リクエスト内に `redirect_uri` パラメーターが含まれることを要求しなければならない。

>

8. 暗号化されていないネットワーク接続を介して認可レスポンスを送信しないこと、及びこの目的で http スキームを使用するリダイレクト URI を許可してはならない。ただし \[RFC8252] セクション 7.3 に記述されたループバックインターフェースリダイレクションを使用するネイティブクライアントについてはこの限りではない。

### ☑️ レスポンスモード

`response_mode` パラメーターには `jwt` をセットします。

> "FAPI 2.0 Message Signing Profile, 5.4. Signing authorization responses, 5.4.1. Requirements for Authorization Servers"
> FAPI2 認可レスポンス署名を実装する認可サーバーは

1. JWT Secured Authorization Response Mode for OAuth 2.0 \[JARM] によって署名された認可レスポンスのサポート、使用要求、発行を行わなければならない。

> "FAPI 2.0 Message Signing Profile, 5.4. Signing authorization responses, 5.4.2. Requirements for Clients"
> FAPI2 認可レスポンス署名を実装するクライアントは

1. \[JARM] に定義されるように、認可リクエスト内の response\_mode パラメーターの値を jwt にセットしなければならない。

これらを踏まえると、PAR エンドポイントへのリクエストは以下のようになります。

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

client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJraWQi...
&client_id={Client ID}
&response_type=code
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=myscope
&code_challenge=E9Melhoa...
&code_challenge_method=S256
&response_mode=jwt
```

その後、認可サーバーは受け取ったリクエストパラメーター群を Authlete の `/pushed_auth_req` API に送信します。

認可サーバーから `/pushed_auth_req` API への呼び出しは以下のようになります。

```shell theme={null}
curl -s -X POST https://us.authlete.com/api/{Service ID}/pushed_auth_req \
-H 'Authorization: Bearer {Authlete API Access Token}' \
-H 'Content-type: application/json' \
-d '{"parameters":"client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=eyJraWQi...&client_id={Client ID}&response_type=code&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcb&scope=myscope&code_challenge=E9Melhoa...&code_challenge_method=S256&response_mode=jwt"}'
```

成功レスポンスには以下のようにリクエスト URI (`requestUri`) が含まれています。

```json theme={null}
{
  "resultCode": "A245001",
  "resultMessage": "[A245001] Successfully registered a request object for client ({Client ID}), URI is urn:ietf:params:oauth:request_uri:QbG....",
  "action": "CREATED",
  "requestUri": "urn:ietf:params:oauth:request_uri:QbG...",
  "responseContent": "{\"expires_in\":300,\"request_uri\":\"urn:ietf:params:oauth:request_uri:QbG...\"}"
}
```

### 2. 認可リクエスト

<img src="https://mintcdn.com/authlete/oZd1VUaYFwHO2MBx/protocols-and-flows/compliance-profiles/auth-req-and-res-cropped-ja.png?fit=max&auto=format&n=oZd1VUaYFwHO2MBx&q=85&s=d458b40380b8671849f635d007450c79" width="2244" height="934" data-path="protocols-and-flows/compliance-profiles/auth-req-and-res-cropped-ja.png" />

リクエスト URI を取得した後、クライアントは認可サーバーに認可リクエストを送信します。

認可リクエストの内容は以下のようになります。

```bash theme={null}
GET /oauth/authorize?client_id={Client ID}&request_uri=urn:ietf:params:oauth:request_uri:6uO... HTTP/1.1
Host: server.example.com
```

その後、認可サーバーは Authlete の `/auth/authorization` API を呼び出します。

認可サーバーから `/auth/authorization` API への呼び出しは以下のようになります。

```shell theme={null}
curl -s -X POST https://us.authlete.com/api/{Service ID}/auth/authorization \
-H 'Authorization: Bearer {Authlete API Access Token}' \
-H 'Content-type: application/json' \
-d '{"parameters":"client_id={Client ID}&request_uri=urn:ietf:params:oauth:request_uri:6uO..."}'
```

成功レスポンスは以下のようになります。

```json theme={null}
{
  "resultCode": "A004001",
  "resultMessage": "[A004001] Authlete has successfully issued a ticket to the service (API Key = {Service API Key}) for the authorization request from the client (ID = {Client ID}). [response_type=code, openid=false]",
  "ticket": "CBKnPeMO...",
  ...
}
```

その後、エンドユーザーはクライアントからの要求内容を認可し、認可サーバーは Authlete の `/auth/authorization/issue` API を呼び出します。

認可サーバーから `/auth/authorization/issue` API への呼び出しは以下のようになります。

```shell theme={null}
curl -s -X POST https://us.authlete.com/api/{Service ID}/auth/authorization/issue \
-H 'Authorization: Bearer {Authlete API Access Token}' \
-H 'Content-type: application/json' \
-d '{"ticket":"CBKnPeMO...","subject":"john","result":"AUTHORIZED"}'
```

成功レスポンスには以下のようになります。

```json theme={null}
{
  "resultCode": "A040001",
  "resultMessage": "[A040001] The authorization request was processed successfully.",
  "authorizationCode": "smseP17u...",
  "responseContent": "https://client.example.org/cb?response=eyJraWQi...",
  ...
}
```

`responseContent` 内の `response` パラメーターには、JWT (`eyJraWQi...`) が含まれています。
この JWT のペイロードには、以下のように認可コードが含まれています。

```json theme={null}
{
  "aud": "{Client ID}",
  "code": "smseP17u...",
  "iss": "https://server.example.com",
  "exp": 1702725889
}
```

### 3. トークンリクエスト

<img src="https://mintcdn.com/authlete/pc0lPZhy9Zo_eIBR/protocols-and-flows/compliance-profiles/token-req-and-res-cropped-ja.png?fit=max&auto=format&n=pc0lPZhy9Zo_eIBR&q=85&s=31b25b943e9c277b961a444a6a5f2a3b" width="2230" height="718" data-path="protocols-and-flows/compliance-profiles/token-req-and-res-cropped-ja.png" />

認可コードを取得した後、クライアントは認可サーバーにトークンリクエストを送信します。PAR エンドポイントと同様に、トークンエンドポイントでも `private_key_jwt` によるクライアント認証が行われます。

また、以下の要件に基づき、認可サーバーは送信者制限されたアクセストークンを発行します。

> "FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements"

4. 送信者制限されたアクセストークンのみを発行しなければならない。

>

5. 送信者制限のメカニズムとして、以下のいずれかを利用しなければならない:

>

* \[RFC8705] に規定される MTLS

>

* \[RFC9449] に規定される DPoP

> "FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.1. General requirements"

1. 以下の方法のいずれかを使用して送信者制限されたアクセストークンをサポートしなければならない:

>

* \[RFC8705] に規定される MTLS

>

* \[RFC9449] に規定される DPoP

今回の場合、送信者制限のメカニズムとして DPoP を使用しているため、クライアントはトークンリクエスト時に DPoP proof JWT を提示する必要があります。

また、下記要件により、DPoP proof JWT の署名アルゴリズムは `PS256`、`ES256`、`EdDSA` のいずれかでなければなりません。

> "FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements"

1. JWT を作成または処理する際、認可サーバー・クライアント・リソースサーバーは、以下に従わなければならない

> <ol>
>   <li>
>     \[RFC8725] に準拠すること
>   </li>
>
>   <li>
>     `PS256`、`ES256`、または (`Ed25519` 形式を使用する) `EdDSA` アルゴリズムのいずれかを使用すること; そして
>   </li>
>
>   <li>
>     `none` アルゴリズムの使用・受理を禁止すること
>   </li>
> </ol>

以上を踏まえると、トークンリクエストは以下のようになります。

```
POST /oauth/token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
DPoP: eyJ0eXAi...

client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGci...
&client_id={Client ID}
&code=smseP17u...
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&grant_type=authorization_code
&code_verifier=ErRt0wrt...
```

トークンリクエストを受け取った後、認可サーバーは Authlete の `/auth/token` API をコールします。

認可サーバーから `/auth/token` API への呼び出しは以下のようになります。

```shell theme={null}
curl -s -X POST https://us.authlete.com/api/{Service ID}/auth/token \
-H 'Authorization: Bearer {Authlete API Access Token}' \
-H 'Content-type: application/json' \
-d '{"parameters":"client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=eyJraWQi...&client_id={Client ID}&code=smseP17u...&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb&grant_type=authorization_code&code_verifier=ErRt0wrt...","dpop":"eyJ0eXAi..."}'
```

成功レスポンスには以下のようにアクセストークン (`accessToken`) が含まれています。

```json theme={null}
{
  "resultCode": "A050001",
  "resultMessage": "[A050001] The token request (grant_type=authorization_code) was processed successfully.",
  "accessToken": "7i9xPkbk...",
  ...
}
```

### 4. 保護リソースへのアクセス

<img src="https://mintcdn.com/authlete/g-UM9YXVfm3jeKy0/protocols-and-flows/compliance-profiles/introspection-req-and-res-cropped-ja.png?fit=max&auto=format&n=g-UM9YXVfm3jeKy0&q=85&s=b300ad7c196dc81c94ec286de75b3974" width="2214" height="746" data-path="protocols-and-flows/compliance-profiles/introspection-req-and-res-cropped-ja.png" />

取得したアクセストークンを用いて、クライアントは以下のようにリソースサーバーの保護リソースへアクセスします。

```
GET /api/sample HTTP/1.1
Authorization: DPoP 7i9xPkbk...
DPoP: eyJ0eXAi...
Host: resource.example.com
```

この際、クライアントはアクセストークンとともに DPoP proof JWT も送信する必要があることに注意してください。

その後、リソースサーバーは Authlete の `/auth/introspection` API を呼び出してアクセストークンを検証します。

リソースサーバーから `/auth/introspection` API への呼び出しは以下のようになります。

```shell theme={null}
curl -s -X POST https://us.authlete.com/api/{Service ID}/auth/introspection \
-H 'Authorization: Bearer {Authlete API Access Token}' \
-H 'Content-type: application/json' \
-d '{"token":"7i9xPkbk...","dpop":"eyJ0eXAi...","htm":"GET","htu":"https://resource.example.com/api/sample"}'
```

成功レスポンスは以下のようになります。

```json theme={null}
{
  "resultCode": "A056001",
  "resultMessage": "[A056001] The access token is valid.",
  "action": "OK",
  ...
}
```
