Table of Contents
本ドキュメントでは、Authlete で Financial-grade API (通称 FAPI ) の機能を利用するための具体的な方法について解説します。
本機能は Authlete 2.0 以降でのみ利用可能になります。
Authlete 2.2 以降をご利用の場合は “Financial-grade API (FAPI) Basics " をご参照ください
FAPI の仕様書はいくつかに分かれており、そのうち part1 は参照系 (read-only) API 、 part2 は更新系 (read-and-write) API に関するセキュリティープロファイルとなっています。各セキュリティープロファイルにおける認可サーバーの要件は異なっており、どちらのプロファイルに従うかによって認可サーバーの振る舞いも異なる形となります。
Authlete において FAPI の機能を有効にするためには、FAPI における要求事項を満たすようにサービスおよびクライアントを適切に設定する必要があります。また、クライアントから認可サーバーへのリクエストについても適切にパラメーターを設定する必要があります。これは、Authlete では FAPI の機能を有効化するかどうかをランタイム で (リクエスト時に) 判定している ためです。したがって、仮にサービス・クライアントが FAPI に対応するよう設定されていても、リクエストの内容が不適切であった場合は FAPI の機能は有効化されないため注意が必要です。
Authlete サーバー上で FAPI の機能を有効化するかどうかを判定する具体的な手順は以下のようになります。
判定条件 | Authlete の処理 |
---|---|
スコープが read-only 属性 (「キー = fapi 」 かつ「値 = r 」の属性) を持つ場合 | read-only API のプロファイルに従う |
スコープが read-and-write 属性 (「キー = fapi 」 かつ「値 = rw 」の属性) を持つ場合 | read-and-write API のプロファイルに従う |
それ以外の場合 | 通常の OAuth 2.0 / OpenID Connect の仕様に従う |
これらを踏まえ、以下では FAPI の機能を利用するために必要となる具体的な設定について解説します。
ここでは、各セキュリティープロファイルをサポートする場合のサービスの設定について解説します。
以下のように設定してください。
設定対象項目 | 設定内容 |
---|---|
サポートするプロフィール群 | FAPI を選択。 |
サポートするクライアント認証方式 | 以下のうち、少なくとも一つを選択。
|
スコープ | read-only 属性を持つスコープを少なくとも一つ作成。 |
read-and-write API プロファイルをサポートする場合、「read-only API プロファイルをサポートする場合」の設定に加えて、以下の設定が必要となります。(ただし、一部の設定内容は上書きされます。)
設定対象項目 | 設定内容 |
---|---|
サポートする認証コンテキスト | 適切な値を設定する。(例: urn:mace:incommon:iap:silver) |
サポートする応答種別 | 以下のうち、少なくとも一つを選択。
|
サポートするクライアント認証方式 | 以下のうち、少なくとも一つを選択。
|
TLS クライアント証明書を紐付けたアクセストークンのサポート | サポートする を選択。 |
スコープ | read-and-write 属性を持つスコープを少なくとも一つ作成。 |
ここでは、各セキュリティープロファイルをサポートする場合のクライアントの設定について解説します。
以下のように設定してください。
設定対象項目 | 設定内容 |
---|---|
クライアント認証方式 | このクライアントが confidential クライアントの場合は、以下のいずれかを選択。
|
リダイレクト URI | https で始まる URI を設定。 |
JWK セットの内容 | (「JWK セットのURI」を設定する場合、本項目の設定は不要となる。)クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、本項目が直接参照する JWK セットには、補足 3. の要求事項を満たす「アサーションの署名検証用の公開鍵」を含めること。 |
JWK セットの URI | (「JWK セットの内容」を設定する場合、本項目の設定は不要となる。)クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、本項目が間接参照する JWK セットには、補足 3. の要求事項を満たす「アサーションの署名検証用の公開鍵」を含めること。 |
read-and-write API プロファイルをサポートする場合、「read-only API プロファイルをサポートする場合」の設定に加えて、以下の設定が必要となります。(ただし、一部の設定内容は上書きされます。)
設定対象項目 | 設定内容 |
---|---|
応答種別 | 以下のうち、少なくとも一つを選択。
|
クライアント認証方式 | このクライアントが confidential クライアントの場合、以下のいずれかを選択。
|
TLS クライアント証明書を紐付けたアクセストークンの使用 | 使用する を選択。 |
認可レスポンスの署名アルゴリズム | このクライアントが JARM を利用する場合、以下のいずれかを選択する。
|
アサーション署名アルゴリズム | クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、以下のいずれかを選択する。
|
リクエストオブジェクトの署名アルゴリズム | 以下のいずれかを選択する。
|
ID トークン署名アルゴリズム | このクライアントが認可サーバーに対して ID トークンを要求する場合、以下のいずれかを選択する。
|
ユーザー情報署名アルゴリズム | このクライアントがユーザー情報エンドポイントを利用する場合、以下のいずれかを選択する。
|
ここでは、各セキュリティープロファイルにおける、各エンドポイント (認可エンドポイント・トークンエンドポイント) に対するリクエストについて解説します。
対象のパラメーター | 要求事項 |
---|---|
redirect_uri | 以下の要求事項を満たすリダイレクト URI 指定すること。
|
state | scope パラメーターに openid スコープが含まれない場合のみ、必須となる。 |
code_challenge | PKCE (RFC 7636) に準拠する値を指定すること。 |
code_challenge_method | S256 を指定すること。 |
scope | read-only 属性を持つスコープを少なくとも一つ指定すること。 |
#
# public クライアントからの認可リクエストの例。
#
# (注意)
# * scope: accounts スコープは read-only 属性を持つものとする。
# * state: 必須ではないが OAuth 2.0 の仕様により推奨される。
# * nonce: OpenID Connect の仕様により response_type に
# id_token を含む場合は必須。
#
GET /api/authorization?
response_type=code+id_token&
client_id=285946231596&
redirect_uri=https://my-client.com/callback&
scope=openid+accounts&
code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&
code_challenge_method=S256&
state=mystate&
nonce=mynonce
各リクエストパラメーターに対する要求事項
read-and-write API プロファイルのリクエストを行う場合、「read-only API プロファイルに対応するリクエスト」における要求事項に加えて、以下の要求事項を満たす必要があります。(ただし、一部の要求事項は上書きされます。)
対象のパラメーター | 要求事項 |
---|---|
request | (request_uri パラメーターを利用する場合、本要求事項は不要となる。)補足 4. の要求事項を満たすリクエストオブジェクトを指定すること。 |
request_uri | (request パラメーターを利用する場合、本要求事項は不要となる。)補足 4. の要求事項を満たすリクエストオブジェクトを参照する URL を指定すること。 |
response_type | code id_token または code id_token token を指定すること。ただし、このクライアントが常に JARM を利用する場合、上記要求事項は不要となる。 |
code_challenge | public クライアントの場合のみ必須。PKCE (RFC 7636) に準拠する値を指定すること。 |
code_challenge_method | public クライアントの場合のみ必須。S256 を指定すること。 |
scope | read-and-write 属性を持つスコープを少なくとも一つ指定すること。 |
claims |
acr クレームを必須クレーム ("essential":true") として含めること。
{ "id_token": { "acr": { "essential": true, "values": ["urn:mace:incommon:iap:silver"] } } } |
#
# confidential クライアントからの認可リクエストの例。
#
# (注意)
# * scope: payments スコープは read-and-write 属性を持つものとする。
# * state: 必須ではないが OAuth 2.0 の仕様により推奨される。
# * nonce: OpenID Connect の仕様により、response_type に
# id_token を含む場合は必須。
#
GET /api/authorization?
response_type=code+id_token&
client_id=291985138172&
scope=openid+payments&
redirect_uri=https://my-client.com/callback&
state=mystate&
nonce=mynonce&
claims={"id_token":{"acr":{"essential":true,"values":["urn:mace:incommon:iap:silver"]}}}&
request=eyJh...[省略]...nPQ
対象のパラメーター | 要求事項 |
---|---|
client_assertion | クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、本パラメーターに指定されるアサーションを生成する際には、補足 3. の要求事項を満たす鍵を用いて署名を行うこと。 |
#
# public クライアントからのトークンリクエストの例。
#
POST /api/token
client_id=285946231596&
grant_type=authorization_code&
code=_vaXlQ_ItUX4hiWzXgOT-Jp9-oVPKGQ6Q6QZu_P2GXw&
redirect_uri=https://my-client.com/callback&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
各リクエストパラメーターに対する要求事項
read-and-write API プロファイルにおいてリクエストを行う場合、「read-only API プロファイルにおけるリクエスト」での要求事項に加えて、以下の要求事項を満たす必要があります。
対象のパラメーター | 要求事項 |
---|---|
client_assertion | クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、本パラメーターに指定するアサーションに署名を付与する際には、「アサーション署名アルゴリズム」で指定したアルゴリズムを用いること。 |
クライアント証明書
「TLS クライアント証明書を紐付けたアクセストークンの使用」が有効となっているため、リクエストを行う際には、クライアントはトークンエンドポイントに対してクライアント証明書を提示する必要があります。
リクエストの例
#
# confidential クライアントからのトークンリクエストの例。
#
# (注意)
# * クライアント認証方式は PRIVATE_KEY_JWT を選択している想定。
# * 以下では例示されていないが、「TLS クライアント証明書を紐付
# けたアクセストークンの使用」が有効化されているため、クライ
# アントはトークンエンドポイントに対してクライアント証明書を
# 提示する必要がある。
#
POST /api/token
client_id=291985138172&
grant_type=authorization_code&
code=YG-gD9v-vmnuKaHkRHcvWq1UxlxT_9vgj28ffxIAX40&
redirect_uri=https://my-client.com/callback&
client_assertion=eyJh...[省略]...OWg&
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
スコープの属性については、こちらの記事 (TBW) を参照してください。
JARM については、こちらの記事 を参照してください。
FAPI part1 には、以下の要求事項があげられています。
Financial Services – Financial API - Part 1, 5.2.2. Authorization Server
The authorization server,
…
5. shall require a key of size 2048 bits or larger if RSA
algorithms are used for the client authentication;
6. shall require a key of size 160 bits or larger if elliptic
curve algorithms are used for the client authentication;
これより、クライアント認証方式で PRIVATE_KEY_JWT を選択している場合、クライアントがアサーション (JWS) の署名に用いる秘密鍵とその検証用に用いる公開鍵は以下の要求事項を満たす必要があります。
アサーション署名アルゴリズム | アサーションの署名・検証に用いる鍵に対する要求事項 |
---|---|
RSA 系のアルゴリズムを選択している場合 | 鍵のサイズが 2048 ビット以上であること。 |
EC 系のアルゴリズムを選択している場合 | 鍵のサイズが 160 ビット以上であること。 |
それ以外の場合 | 要求事項はない。 |
FAPI part2 では、リクエストオブジェクトに対して以下の要求事項が課せられます。
Financial Services – Financial API - Part 2, 5.2.2. Authorization Server
The authorization server,
…
1. shall require the request or request_uri parameter to be passed as a JWS signed JWT as in clause 6 of [OIDC];
…
10. shall require that all parameters are present inside the signed request object passed in the request or request_uri parameter;
…
13. shall require the request object to contain an exp claim;
…
15. shall require the aud claim in the request object to be, or to be an array containing, the OP’s Issuer Identifier URL;
更に、署名についても以下の要求事項が課せられます。
Financial Services – Financial API - Part 2, 8.6 JWS algorithm considerations
Both clients and authorization servers:
1. shall use PS256 or ES256 algorithms;
2. should not use algorithms that use RSASSA-PKCS1-v1_5 (e.g. RS256);
3. shall not use none;
これらをまとめると、read-and-write API プロファイルをサポートする場合、リクエストオブジェクトに対して以下の要求事項が課せられることになります。
以下は、上記要求事項を満たすリクエストオブジェクトのペイロードの例になります。
{
"response_type": "code id_token",
"exp": 1554973000,
"aud": "https://my-authz-server.com/",
"client_id": "291985138172",
"scope": "openid payments",
"redirect_uri": "https://my-client.com/callback",
"state": "mystate",
"nonce": "mynonce",
"claims": {
"id_token": {
"acr": {
"values": ["urn:mace:incommon:iap:silver"],
"essential": true
}
}
}
}