このページは Authlete 3.0 用です。2.x については FAPI 2.0 メッセージ署名(認可リクエストの署名)2.x をご覧ください。
概要
本ドキュメントでは、Authlete を利用して FAPI 2.0 メッセージ署名プロファイル: 認可リクエストの署名 (以降、“FAPI 2.0 認可リクエスト署名”と呼称) をサポートする方法について解説します。FAPI 2.0 認可リクエスト署名は Authlete 2.3 以降で利用可能です。
FAPI 2.0 認可リクエスト署名では、FAPI 2.0 セキュリティプロファイルに規定される全要件を満たす必要があります。
前提条件
- 本ドキュメントでは、認可コードフローを例に解説を行います。
- クライアント認証には
private_key_jwtが使用されます。 - アクセストークンの送信者制限メカニズムとして DPoP が使用されます。

サービスの設定
以下のようにサービスを設定してください。☑️ 基本情報 > トークン発行者識別子

☑️ 基本情報 > サポートするプロフィール群

FAPI を含めます。☑️ 認可 > サポートする認可種別

AUTHORIZATION_CODE を含めます。☑️ 認可 > サポートする応答種別

CODE を含めます。☑️ 認可 > 認可エンドポイント > 認可エンドポイントの URI

☑️ 認可 > 認可エンドポイント > iss レスポンスパラメーター

含めるを選択します。“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- RFC9207 に従って、認可レスポンスに iss レスポンスパラメーターを含めなければならない。
☑️ 認可 > 認可エンドポイント > リダイレクション URI の可変性

可変を選択します。“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- 暗号化されていないネットワーク接続を介して認可レスポンスを送信しないこと、及びこの目的で http スキームを使用するリダイレクト URI を許可してはならない。ただし [RFC8252] セクション 7.3 に記述されたループバックインターフェースリダイレクションを使用するネイティブクライアントについてはこの限りではない。
☑️ 認可 > トークンエンドポイント > トークンエンドポイント URI

☑️ 認可 > トークンエンドポイント > サポートするクライアント認証方式

PRIVATE_KEY_JWT を含めます。“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- クライアント認証は以下のいずれかを利用しなければならない:
- [RFC8705] のセクション 2 に規定される MTLS
- [OIDC] のセクション 9 に規定される private_key_jwt
☑️ 認可 > トークンエンドポイント > クライアントアサーションに含まれる aud クレームの値

制限するを選択します。“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- クライアントアサーションの aud クレームに含まれる値は、文字列型かつ認可サーバーの発行者識別子 ([RFC8414] にて規定) の値でなければならない。
☑️ 認可 > 認可リクエスト登録エンドポイント > 認可リクエスト登録エンドポイント

☑️ 認可 > 認可リクエスト登録エンドポイント > 事前登録認可リクエストの有効期間

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- プッシュ式認可リクエストに対して発行される request_uri は expires_in の値が 600 秒未満でなければならない。
☑️ 認可 > リクエストオブジェクト > nbf クレーム

必須を選択します。“FAPI2 Message Signing profile, 5.3.1. Requirements for Authorization Servers” FAPI 2 認可リクエスト署名を実装する認可サーバーは
- nbf クレームを含むリクエストオブジェクトを要求しなければならず、当該クレームの値は現在より遡って 60 分以内でなければならない。
☑️ トークン > リフレッシュトークン > リフレッシュトークン継続使用

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


- スコープ名:
myscope - スコープ属性: (属性のキー =
fapi2, 属性の値 =ms-authreq)
☑️ ID トークン > 許容されるクロックスキュー

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- 時刻のずれに対応するために、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 秒先までと定めている。
☑️ 基本設定 > 発行者識別子

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

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

AUTHORIZATION_CODE を含めます。☑️ エンドポイント > 基本設定 > サポート可能なレスポンスタイプ

CODE を含めます。☑️ エンドポイント > 認可 > 認可エンドポイントURL

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

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- [RFC9207] に従って、認可レスポンスに iss レスポンスパラメーターを含めなければならない。
☑️ エンドポイント > 認可 > ループバックリダイレクト URI

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- 暗号化されていないネットワーク接続を介して認可レスポンスを送信しないこと、及びこの目的で http スキームを使用するリダイレクト URI を許可してはならない。ただし [RFC8252] セクション 7.3 に記述されたループバックインターフェースリダイレクションを使用するネイティブクライアントについてはこの限りではない。
☑️ 認可 > リクエストオブジェクト > nbf クレーム

“FAPI2 Message Signing profile, 5.3.1. Requirements for Authorization Servers” FAPI2 認可リクエスト署名を実装する認可サーバーは
- nbf クレームを含むリクエストオブジェクトを要求しなければならず、当該クレームの値は現在より遡って 60 分以内でなければならない。
☑️ エンドポイント > トークン > トークンエンドポイントURL

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

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 クレームの値

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- クライアントアサーションの aud クレームに含まれる値は、文字列型かつ認可サーバーの発行者識別子 ([RFC8414] にて規定) の値でなければならない。
☑️ エンドポイント > 一般 > プッシュ式認可リクエスト(PAR)

- PAR エンドポイントの URL を設定します。
- PAR エンドポイントの有効期間 (リクエスト URI の有効期間) に 600 秒未満の値を設定します。
“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- プッシュ式認可リクエストに対して発行される request_uri は expires_in の値が 600 秒未満でなければならない。
☑️ トークン&クレーム > リフレッシュトークン > リフレッシュトークンローテーション

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

“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- 時刻のずれに対応するために、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 秒先までと定めている。
☑️ トークン&クレーム > 詳細 > スコープ


- スコープ名:
myscope - スコープのプロパティ: キー =
fapi2、値 =ms-authreq
クライアントの設定
以下のようにクライアントを設定してください。☑️ 基本情報 > クライアントタイプ

CONFIDENTIAL を選択します。☑️ 認可 > 認可種別

AUTHORIZATION_CODE を含めます。☑️ 認可 > 応答種別

CODE を含めます。☑️ 認可 > リダイレクト URI

https で始まるリダイレクト URI を登録します。☑️ 認可 > トークンエンドポイント > クライアント認証方式

PRIVATE_KEY_JWT を選択します。“FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.1. General requirements”
- 以下のいずれかまたは両方を使用してクライアント認証をサポートしなければならない:
- [RFC8705] のセクション 2 で指定される MTLS
- [OIDC] のセクション 9 で指定される private_key_jwt
☑️ 認可 > トークンエンドポイント > アサーション署名アルゴリズム

ES256 を選択します。“FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements”
- JWT を作成または処理する際、認可サーバー・クライアント・リソースサーバーは、以下に従わなければならない
- [RFC8725] に準拠すること
PS256、ES256、または (Ed25519形式を使用する)EdDSAアルゴリズムのいずれかを使用すること; そしてnoneアルゴリズムの使用・受理を禁止すること
☑️ JWK セット > JWK セットの内容

private_key_jwt を使用するため、JWK セットにはクライアントアサーション用の署名鍵を含める必要があります。JWK セットに含める鍵群は下記要件を満たす必要があることに注意してください。“FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements”
- RSA キーは最低 2048 ビットの長さでなければならない。
- EC キーは最低 224 ビットの長さでなければならない。
☑️ 基本設定 > クライアントタイプ

機密を選択します。☑️ エンドポイント > 基本設定 > サポート可能な認可タイプ

AUTHORIZATION_CODE を含めます。☑️ エンドポイント > 基本設定 > サポート可能なレスポンスタイプ

CODE を含めます。☑️ エンドポイント > 基本設定 > リダイレクトURI

https で始まるリダイレクト URI を登録します。☑️ エンドポイント > トークン > クライアント認証方式

PRIVATE_KEY_JWT を選択します。“FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.1. General requirements”
- 以下のいずれかまたは両方を使用してクライアント認証をサポートしなければならない:
- [RFC8705] のセクション 2 で指定される MTLS
- [OIDC] のセクション 9 で指定される private_key_jwt
☑️ エンドポイント > トークン > アサーション署名アルゴリズム

ES256 を選択します。“FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements”
- JWT を作成または処理する際、認可サーバー・クライアント・リソースサーバーは、以下に従わなければならない
- [RFC8725] に準拠すること
PS256、ES256、または (Ed25519形式を使用する)EdDSAアルゴリズムのいずれかを使用すること; そしてnoneアルゴリズムの使用・受理を禁止すること
☑️ キーマネジメント > JWKセット > JWKセットの内容

private_key_jwt を使用するため、JWK セットにはクライアントアサーション用の署名鍵を含める必要があります。JWK セットに含める鍵群は下記要件を満たす必要があることに注意してください。“FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements”
- RSA キーは最低 2048 ビットの長さでなければならない
- EC キーは最低 224 ビットの長さでなければならない
動作確認
本セクションでは、FAPI 2.0 認可リクエスト署名に準拠した認可コードフローの動作確認を行います。1. プッシュ式認可リクエスト (PAR リクエスト)

☑️ クライアント認証
上記で設定した通り、PAR エンドポイントでのクライアント認証にはprivate_key_jwt が利用されます。
☑️ リクエストオブジェクト
PAR リクエスト内のリクエストオブジェクト (request パラメーターの値) は、署名された JWT でなければなりません。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.1. Requirements for Authorization Servers” FAPI2 認可リクエスト署名を実装する認可サーバーは
- JAR [RFC9101] にしたがい、PAR エンドポイント [RFC9126] において、署名されたリクエストオブジェクトのサポート、使用要求、検証を行わなければならない。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.2. Requirements for Clients” FAPI2 認可リクエスト署名を実装するクライアントは
- 全ての認可パラメーターを、JAR 形式の署名されたリクエストオブジェクトに内包した上で、PAR エンドポイント [RFC9126] に送信しなければならない。
iss クレーム
iss クレームにはクライアント ID を設定します。
“RFC 9126, 3. The “request” Request Parameter” 認可サーバーは Section 2.1 に規定される処理ルールに加えて、以下の手順を踏まなければならない: …
- クライアント認証において認証用クレデンシャルが利用される場合、認証された client_id がリクエストオブジェクト内の client_id クレームの値と合致しないのなら、認可サーバーはそのリクエストを拒否しなければならない。さらに、iss クレームの値を client_id と一致させることを要求するかどうかは、認可サーバーの裁量に委ねられる。
response_type クレーム
response_type クレームには code をセットします。
scope クレーム
scope クレームには myscope をセットします。
code_challenge クレーム & code_challenge_method クレーム
code_challenge クレームをセットし、code_challenge_method には S256 をセットします。
“FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.2. Authorization code flow”
- PKCE [RFC7636] を使用し、コードチャレンジメソッドとして S256 を設定しなければならない。
redirect_uri クレーム
redirect_uri クレームには、クライアントの設定で登録した URI をセットします。
“FAPI2 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.2. Authorization endpoint flows”
- プッシュ式認可リクエスト内に
redirect_uriパラメーターが含まれることを要求しなければならない。
- 暗号化されていないネットワーク接続を介して認可レスポンスを送信しないこと、及びこの目的で http スキームを使用するリダイレクト URI を許可してはならない。ただし [RFC8252] セクション 7.3 に記述されたループバックインターフェースリダイレクションを使用するネイティブクライアントについてはこの限りではない。
aud クレーム
aud クレームの値は、認可サーバーの発行者識別子 URL かそれを含む配列でなければなりません。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.1. Requirements for Authorization Servers” FAPI2 認可リクエスト署名を実装する認可サーバーは
- リクエストオブジェクト内の aud クレームの値として、認可サーバーの発行者識別子 URL、またはそれを含む配列を要求しなければならない。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.2. Requirements for Clients” FAPI2 認可リクエスト署名を実装するクライアントは
- リクエストオブジェクト内の aud クレームには、認可サーバーの発行者識別子 URL を設定して送信しなければならない。
nbf クレーム & exp クレーム
nbf クレームの値は、現在時刻より遡って 60 分以内の値でなければなりません。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.1. Requirements for Authorization Servers” FAPI 2 認可リクエスト署名を実装する認可サーバーは
- nbf クレームを含むリクエストオブジェクトを要求しなければならず、当該クレームの値は現在より遡って 60 分以内でなければならない。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.2. Requirements for Clients” FAPI2 認可リクエスト署名を実装するクライアントは加えて、リクエストオブジェクトの有効期間 (
- リクエストオブジェクト内に nbf クレームを含めて送信しなければならない。
exp - nbf) は、60 分以下でなければなりません。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.1. Requirements for Authorization Servers” FAPI 2 認可リクエスト署名を実装する認可サーバーは
- exp クレームを含み、かつ nbf クレームの時刻から 60 分を超えない有効期間を持つリクエストオブジェクトを要求しなければならない。
“FAPI2 Message Signing profile, 5.3. Signing authorization requests, 5.3.2. Requirements for Clients” FAPI2 認可リクエスト署名を実装するクライアントは
- exp クレームをリクエストオブジェクトに含め、その有効期間は 60 分を超えてはならない。
/pushed_auth_req API に送信します。
認可サーバーから /pushed_auth_req API への呼び出しは以下のようになります。
requestUri) が含まれています。
2. 認可リクエスト

/auth/authorization API を呼び出します。
認可サーバーから /auth/authorization API への呼び出しは以下のようになります。
/auth/authorization/issue API を呼び出します。
認可サーバーから /auth/authorization/issue API への呼び出しは以下のようになります。
authorizationCode) が含まれています。
3. トークンリクエスト

private_key_jwt によるクライアント認証が行われます。
また、以下の要件に基づき、認可サーバーは送信者制限されたアクセストークンを発行します。
“FAPI 2.0 Security Profile, 5.3.2. Requirements for authorization servers, 5.3.2.1. General requirements”
- 送信者制限されたアクセストークンのみを発行しなければならない。
- 送信者制限のメカニズムとして、以下のいずれかを利用しなければならない:
- [RFC8705] に規定される MTLS
- [RFC9449] に規定される DPoP
“FAPI 2.0 Security Profile, 5.3.3. Requirements for clients, 5.3.3.1. General requirements”
- 以下の方法のいずれかを使用して送信者制限されたアクセストークンをサポートしなければならない:
- [RFC8705] に規定される MTLS
- [RFC9449] に規定される DPoP
PS256、ES256、EdDSA のいずれかでなければなりません。
“FAPI 2.0 Security Profile, 5.4. Cryptography and secrets, 5.4.1. General requirements”
- JWT を作成または処理する際、認可サーバー・クライアント・リソースサーバーは、以下に従わなければならない
以上を踏まえると、トークンリクエストは以下のようになります。
- [RFC8725] に準拠すること
PS256、ES256、または (Ed25519形式を使用する)EdDSAアルゴリズムのいずれかを使用すること; そしてnoneアルゴリズムの使用・受理を禁止すること
/auth/token API をコールします。
認可サーバーから /auth/token API への呼び出しは以下のようになります。
accessToken) が含まれています。
4. 保護リソースへのアクセス

/auth/introspection API を呼び出してアクセストークンを検証します。
リソースサーバーから /auth/introspection API への呼び出しは以下のようになります。