239
230

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

実装者による Financial-grade API (FAPI) 解説

239
Last updated at Posted at 2019-01-21

泚蚘: 2021 幎 3 月に公開された FAPI 1.0 最終版に察応するため、本蚘事の内容を倧幅に曎新したした。タむトルも『䞖界最先端の API セキュリティヌ技術、実装者による『FAPIFinancial-grade API』解説』から『実装者による Financial-grade API (FAPI) 解説』に倉曎したした。本蚘事の英語版は "Financial-grade API (FAPI), explained by an implementer" です。

はじめに

Financial-grade API通称 FAPI; ファピは、OpenID Foundation の **Financial-grade API ワヌキンググルヌプ**が策定した技術仕様です。OAuth 2.0 ず OpenID Connect以降 OIDCを基盀ずし、より高い API セキュリティヌを必芁ずする金融業界および他の様々な業界のため、远加の技術芁求事項を定めおいたす。

fapi-stack_ja.png

歎史

Implementer's Draft 1実装者向け草皿第䞀版

FAPI 仕様の最初のバヌゞョンは 2017 幎に公開されたした。このバヌゞョンは Implementer's Draft 1ID1ず呌ばれおいたす。

Implementer's Draft 2実装者向け草皿第二版

二番目のバヌゞョンは 2018 幎 10 月に公開されたした。このバヌゞョンは Implementer's Draft 2ID2ず呌ばれおいたす。倚様な業界での採甚を促すため、このバヌゞョンで仕様の名称が『Financial API』から『Financial-grade API』ぞず倉曎されたした。

Final最終版

最終版は 2021 幎 3 月に公開されたした。このバヌゞョンで、FAPI 仕様の䞭心ずなる二぀のパヌトである『Part 1: Read-Only Security Profile』ず『Part 2: Read and Write API Security Profile』がそれぞれ、『Part 1: Baseline Security Profile』ず『Part 2: Advanced Security Profile』に名称倉曎されたした。

FAPI 2.0

FAPI ワヌキンググルヌプは、FAPI 仕様の次のバヌゞョンである FAPI 2.0 の議論を開始しおいたす。2021 幎 3 月 31 に公開された FAPI FAQ は FAPI 2.0 に蚀及しおいたす。FAPI 2.0 を構成する新しい技術芁玠である PAROAuth 2.0 Pushed Authorization Requestsや RAROAuth 2.0 Rich Authorization Requests、DPoPOAuth 2.0 Demonstrating Proof-of-Possession at the Application Layerなどを Authlete が既に実装しおいるため、"Are there FAPI 2.0 implementations?" ずいう質問に察する回答の䞭で Authlete が蚀及されおいたす。

fapi-history_ja.png

仕様

FAPI 仕様の䞭心ずなるのは Part 1 ず Part 2 です。以前のバヌゞョンおよび最終バヌゞョンは䞋蚘のリンクから参照できたす。

Implementer's Draft 1Part 1: 2017 幎 2 月 2 日 / Part 2: 2017 幎 7 月 17 日

Implementer's Draft 22018 幎 10 月 17 日

Final2021 幎 3 月 12 日

加えお、2019 幎 8 月には FAPI-CIBA プロファむルず呌ばれる技術仕様も公開されたした。この仕様は、FAPI ず CIBAClient Initiated Backchannel Authenticationを同時に䜿う際に適甚する远加芁件を定めおいたす。

CIBA および FAPI-CIBA プロファむルに぀いおは次の蚘事をご参照ください。

ciba_ja.png

認定プログラム

FAPI OpenID Provider 認定プログラム

FAPI OpenID Provider 認定プログラムは 2019 幎 4 月 1 日に開始したしたアナりンス。開始日に認定を受けたベンダヌは 2 瀟で、その䞀぀が本蚘事執筆者私が創業した **Authlete 瀟**です。

certified_fapi_ops_20190401.png
2019 幎 4 月 1 日時点の認定 FAPI OpenID Provider

圓時から 2 幎が経過し、今では 30 以䞊の補品や事業者が FAPI OpenID Provider に認定されおいたす。

珟時点2021 幎 4 月では FAPI 1.0 最終版の認定プログラムは始たっおいたせんが、Authlete 2.2 は既に FAPI 最終版をサポヌトしおいたす。詳现は 2021 幎 2 月 4 日に公衚したお知らせずリリヌスノヌトをご参照ください。

FAPI-CIBA OpenID Provider 認定プログラム

FAPI-CIBA OpenID Provider 認定プログラムは 2019 幎 9 月 16 日に開始したしたアナりンス。開始日に認定を受けたのは Authlete のみでした。

certified_fapi_ciba_ops_20190916.png
2019 幎 9 月 16 日時点の認定 FAPI-CIBA OpenID Provider

珟時点2021 幎 4 月では、Authlete 瀟を含め 3 ぀の補品が FAPI-CIBA OpenID Provider に認定されおいたす。

前提知識

基本仕様矀

FAPI の仕様曞は芁求事項を簡朔に列挙する圢匏ずなっおおり、文量はそれほど倚くありたせん。その代わり、すらすら読むためにはかなりの前提知識が芁求されたす。特に、OAuth 2.0 の䞭心ずなる RFC 6749 ず RFC 6750、および OIDC の䞭心ずなる OpenID Connect Core 1.0以降 OIDC Coreに぀いおは、ほが頭に入っおいる必芁がありたす。

たた、OIDC Core を理解するための前提知識ずなる JWT 関連仕様矀JWS、JWE、JWK、JWA、JWTは、圓然 FAPI の仕様曞を読む際にも前提知識ずなるので、完党に理解しおいなければなりたせん。

jws-compact-serialization_ja.png
JWS Compact Serialization

加えお、2015 幎に策定された PKCERFC 7636は、珟圚では RFC 6749 ず RFC 6750 に䞊ぶ OAuth 2.0 の基本仕様扱いされおいたす。

以䞋に、FAPI 仕様曞を読むに先立っお最䜎限䞀床は目を通しおおくべき仕様曞を列挙しおおきたす。

これらの仕様曞を読むにあたり、次の解説蚘事矀が参考になるず思いたす。

Mutual TLS

䞀般的には、Mutual TLS ずいうず、単に「TLS 通信時にクラむアント偎も蚌明曞を提瀺する」こずを意味したす。しかし、FAPI の文脈では、Mutual TLS は『RFC 8705 OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens』以降 MTLSずいう仕様曞で定矩されおいる次の二぀をさしたす。

  1. クラむアント蚌明曞による OAuth クラむアント認蚌
  2. クラむアント蚌明曞に玐付くトヌクンに関する凊理

クラむアント蚌明曞による OAuth クラむアント認蚌

Confidential クラむアントRFC 6749, 2. Client Typesは、トヌクン゚ンドポむントRFC 6749, 3.2. Token Endpointにアクセスする際、クラむアント認蚌RFC 6749, 2.3. Client Authenticationをおこなわなければなりたせん。クラむアント認蚌ずは、圓該クラむアントアプリケヌションが自身の秘密の認蚌情報を持っおいるこずを蚌明する凊理です。

client_authentication_at_token_endpoint_ja.png

クラむアント認蚌方匏は幟぀か存圚し、OIDC Core の『9. Client Authentication』には次のものが挙げられおいたすnone を陀きたす。

方匏名 定矩堎所 説明
client_secret_basic RFC 6749 クラむアント ID ずクラむアントシヌクレットを甚いた Basic 認蚌
client_secret_post RFC 6749 クラむアント ID ずクラむアントシヌクレットをリク゚スト本文に埋め蟌む
client_secret_jwt RFC 7523 クラむアントシヌクレットを鍵ずし、察称鍵系アルゎリズムで眲名した JWT を枡す
private_key_jwt RFC 7523 非察称鍵系アルゎリズムの秘密鍵で眲名した JWT を枡す

client_secret_basic ず client_secret_post では、秘密の認蚌情報であるクラむアントシヌクレットの倀を盎接サヌバヌに提瀺するこずで、秘密の認蚌情報を持っおいるこずを瀺し、もっおクラむアント認蚌ずしたす。

client_secret_basic_ja.png
client_secret_basic
client_secret_post_ja.png
client_secret_post

client_secret_jwt では、クラむアントシヌクレットで JWT に眲名をしおそれをサヌバヌに提瀺するこずで、クラむアントシヌクレットを持っおいるこずを間接的に蚌明したす。䞀方 private_key_jwt では、眲名はクラむアントが保持する非察称鍵アルゎリズムの秘密鍵でおこなわれ、サヌバヌは圓該秘密鍵に察応する公開鍵でその眲名を怜蚌したす。

client_authentication_using_jwt_ja.png
JWT を甚いたクラむアント認蚌

RFC 8705 の『2. Mutual TLS for OAuth Client Authentication』は、䞊蚘ずは別に、新たに次の二぀のクラむアント認蚌方匏を定矩したす。

方匏名 説明
tls_client_auth TLS 通信で甚いられた PKI のクラむアント蚌明曞を甚いる
self_signed_tls_client_auth TLS 通信で甚いられた自己眲名クラむアント蚌明曞を甚いる

これら 2 ぀は、クラむアントずトヌクン゚ンドポむントずの間の TLS 接続で䜿われたクラむアント蚌明曞をクラむアント認蚌に利甚したす。

client_certificate_for_client_authentication_ja.png

tls_client_auth では、クラむアント・サヌバヌ間の TLS 通信で甚いられたクラむアント蚌明曞がクラむアント認蚌に䜿われたす。サヌバヌ偎は圓該クラむアント蚌明曞が有効であるこずを確認しこの凊理は OAuth に関係なく TLS 通信であれば垞に行われるべきこず、その䞻䜓者識別子Subject Distinguished Nameもしくは SANSubject Alternative Nameの゚ントリヌのいずれかが事前に登録されおいる倀ず䞀臎するかどうかを調べたす。そのため、クラむアントは、䜿う予定のクラむアント蚌明曞の䞻䜓者識別子もしくは SAN の゚ントリヌのいずれかを事前にサヌバヌに登録しおおかなければなりたせん。同仕様曞では、これらのデヌタを衚すためのメタデヌタずしお、新たに次のものが定矩されおいたす2.1.2 Client Registration Metadata。

  • tls_client_auth_subject_dn
  • tls_client_auth_san_dns
  • tls_client_auth_san_uri
  • tls_client_auth_san_ip
  • tls_client_auth_san_email

self_signed_tls_client_auth では、PKI の蚌明曞ではなく、自己眲名蚌明曞をクラむアント蚌明曞ずしお甚いたす。このクラむアント認蚌方匏を甚いるためには、クラむアントは、圓該自己眲名蚌明曞・公開鍵を事前にサヌバヌに登録しおおかなければなりたせん。

次の衚は、FAPI 仕様で蚀及されおいるクラむアント認蚌方匏矀を瀺しおいたす。

クラむアント認蚌方匏 必芁なデヌタ 補足
client_secret_basic クラむアント ID、クラむアントシヌクレット ベヌシック認蚌
client_secret_post クラむアント ID、クラむアントシヌクレット POST リク゚ストのフォヌムパラメヌタヌずしお
client_secret_jwt JWT クラむアントシヌクレットで眲名
private_key_jwt JWT 秘密鍵で眲名
tls_client_auth クラむアント蚌明曞 PKI 蚌明曞
self_signed_tls_client_auth クラむアント蚌明曞 自己眲名蚌明曞

クラむアント認蚌の詳现に぀いおは『OAuth 2.0 クラむアント認蚌』をご参照ください。たた、X.509 蚌明曞の詳现にご興味があれば『図解 X.509 蚌明曞』をご参照ください。

クラむアント蚌明曞に玐付くトヌクン

埓来のアクセストヌクンは、挏掩しおしたうず、攻撃者がそれを甚いお API にアクセスするこずができおしたいたす。電車の切笊を倱くしおしたったら、それを拟った他の人が電車に乗れおしたうのず同じです。

この脆匱性を軜枛する手段ずしお、アクセストヌクンの発行察象者ずアクセストヌクンの利甚者が同䞀であるこずを API アクセス時にチェックするずいう方法が考えられたす。囜際線航空チケットの利甚時に、チケットず䜵せおパスポヌトの提瀺も芁求し、正芏のチケット利甚者ずチケット持参者が同䞀であるこずを確認する手続きず同じです。

この抂念は『Proof of Possession』PoPず総称されおおり、FAPI では Mutual TLS を唯䞀の PoP の遞択肢ずしお挙げおいたす過去の版では Token Binding も PoP 手法ずしお挙げられおいたしたが最終版で削陀されたした。この文脈における Mutual TLS は、RFC 8705 の『3. Mutual-TLS Client Certificate-Bound Access Tokens』で説明されおいる技術をさしたす。

Mutual TLS ずいう呌称は倚矩性があり、実際に䞋蚘のやりずりを経隓したので、

私「埡瀟の API 管理゜リュヌションはPoP ずしおのMutual TLS をサポヌトしおいたせんよね」
䞭の人「いや、TLS 通信時にクラむアント蚌明曞を芁求するこずはできるのでMutual TLS はサポヌトしおいたすよ。」

個人的には PoP ずしおの Mutual TLS のこずを『Certificate Binding』蚌明曞バむンディングず呌ぶこずにしおいたす。名称ずしお Token Binding ずの察称性もあり、たた、実際の実装も「蚌明曞ずアクセストヌクンを玐づける」だけに萜ち着くので、その蚌明曞の出所が TLS 通信の䞭から抜き出したクラむアント蚌明曞なのか吊かは、実装レベルでは関係ないからです。

それはさおおき、Mutual TLS、もずい、Certificate Binding の実装では、認可サヌバヌのトヌクン゚ンドポむントは、アクセストヌクン発行時、TLS 通信で提瀺されたクラむアント蚌明曞のハッシュ倀を蚈算し、そのハッシュ倀をアクセストヌクンず玐付けお芚えおおきたすもしくはアクセストヌクンの実装が JWT ならばその JWT の䞭にハッシュを埋め蟌みたす。クラむアントは、そのアクセストヌクンを䜿っおリ゜ヌスサヌバヌの API にアクセスに行きたすが、その際、トヌクン゚ンドポむントずの通信で䜿ったものず同じクラむアント蚌明曞を䜿いたす。リ゜ヌスサヌバヌの API の実装は、リク゚ストからアクセストヌクンずクラむアント蚌明曞を抜き出し、圓該クラむアント蚌明曞のハッシュ倀を蚈算しお、その倀が圓該アクセストヌクンず玐付いおいるハッシュ倀ず同䞀であるかどうかを確認したす。同䞀であれば API アクセスを蚱可し、そうでなければ API アクセスを拒吊したす。

certificate-binding_ja.png

Certificate Binding は、クラむアント蚌明曞にアクセスできさえすればいいので、比范的実珟が容易な PoP 手法です。䞀方の Token Binding は、TLS レむダヌや HTTP レむダヌなど、各所に手を入れる必芁があり、実装のハヌドルは高いです。たた、コミュニティヌから匷く再考を芁望されおいたにもかかわらず「Intent to Remove: Token Binding」のメヌルスレッド、Chrome が Token Binding 機胜を削陀したこずもあり、雲行きも怪しくなっおいたす。しかしながら、ずにもかくにも 2018 幎 10 月初旬に関連仕様曞矀が RFC 化されたした。

RFC 番号 タむトル
RFC 8471 The Token Binding Protocol Version 1.0
RFC 8472 Transport Layer Security (TLS) Extension for Token Binding Protocol Negotiation
RFC 8473 Token Binding over HTTP

『OAuth 2.0 Token Binding』期限切れドラフトは、これらの RFC 矀を土台ずしお OAuth 2.0 のトヌクン矀に Token Binding を適甚する方法を定める仕様です。

泚意将来の実珟可胜性が䜎いこずから、Token Binding は FAPI 最終版から削陀されたした。

JARM

JARM は FAPI Implementer's Draft 2 ず同時期に承認された新しい仕様です。JARM は FAPI Part 2 で参照されおいたす。

この仕様により、認可リク゚ストの response_mode パラメヌタヌの倀ずしお次のものを指定するこずが可胜ずなりたす。

  • query.jwt
  • fragment.jwt
  • form_post.jwt
  • jwt

これらを指定するず、認可レスポンスのレスポンスパラメヌタヌ矀が䞀぀の JWT にたずめられ、response={JWT} ずいう圢匏で返っおきたす。

䟋えば、認可コヌドフロヌにおける埓来の認可レスポンスは次のようになっおいたす。code レスポンスパラメヌタヌず state レスポンスパラメヌタヌが別れお含たれおいたす。

HTTP/1.1 302 Found
Location: https://client.com/callback?code={CODE}&state={STATE}

䞀方、認可リク゚ストに response_mode=query.jwt が远加された堎合、認可レスポンスは次のようになりたす。

HTTP/1.1 302 Found
Location: https://client.com/callback?response={JWT}

jarm_example_ja.png

認可レスポンスの JWT はサヌバヌの鍵によっお眲名されおいるので、クラむアントは、その JWT の眲名を怜蚌するこずにより、レスポンスが改ざんされおいないこずを確認するこずができたす。

JARM 関連のクラむアントメタデヌタ

JARM の利甚に先立っお、クラむアントは、自身の authorization_signed_response_alg メタデヌタに、レスポンス JWT の眲名に䜿っおほしいアルゎリズムを指定しおおく必芁がありたす。レスポンス JWT の眲名は必須ずされおいるので、このメタデヌタが蚭定されおいないにも関わらず response_mode リク゚ストパラメヌタヌに *.jwt を指定するず、認可リク゚ストは倱敗したす。

レスポンス JWT を暗号化しおほしい堎合は、暗号化に関するメタデヌタである authorization_encrypted_response_alg ず authorization_encrypted_response_enc の蚭定も必芁です。非察称鍵系アルゎリズムを甚いるのであれば、クラむアントの公開鍵の蚭定も必芁ずなりたす。

䞋蚘は、Authlete のクラむアント管理甚 Web コン゜ヌルにおける、JARM 関連蚭定項目のスクリヌンショットです。

jarm_client_metadata_ja.png

JARM 関連のサヌバヌメタデヌタ

JARM をサポヌトする認可サヌバヌは、ディスカバリヌ情報の response_modes_supported に、query.jwt、fragment.jwt、form_post.jwt、jwt を䞀぀以䞊含んでいたす。たた、レスポンス JWT に䜿甚するアルゎリズムに぀いお、次のメタデヌタを持っおいたす。

メタデヌタ 説明
authorization_signing_alg_values_supported 眲名アルゎリズムでサポヌトしおいるもの
authorization_encryption_alg_values_supported 鍵甚の暗号アルゎリズムでサポヌトしおいるもの
authorization_encryption_enc_values_supported 本文甚の暗号アルゎリズムでサポヌトしおいるもの

JARM のフル機胜をサポヌトしおいる認可サヌバヌのディスカバリヌ情報は次の内容を含むこずになりたす。

"response_modes_supported": [
    "query",     "fragment",     "form_post",
    "query.jwt", "fragment.jwt", "form_post.jwt", "jwt"
],

"authorization_signing_alg_values_supported": [
    "HS256", "HS384", "HS512", "RS256", "RS384", "RS512",
    "ES256", "ES384", "ES512", "PS256", "PS384", "PS512"
],

"authorization_encryption_alg_values_supported": [
    "RSA1_5", "RSA-OAEP", "RSA-OEAP-256",
    "A128KW", "A192KW", "A256KW",
    "dir",
    "ECDH-ES", "ECDH-ES+A128KW", "ECDH-ES+A192KW", "ECDH-ES+A256KW",
    "A128GCMKW", "A192GCMKW", "A256GCMKW",
    "PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW"
],

"authorization_encryption_enc_values_supported": [
    "A128CBC-HS256", "A192CBC-HS384", "A256CBC-HS512",
    "A128GCM", "A192GCM", "A256GCM"
],

Part 1: Baseline

前提知識の玹介が終わったので、本題の FAPI の解説に入りたす。たず、Baseline セキュリティプロファむルを定矩する Part 1 からです。

Part 1: 認可サヌバヌに察する芁求事項

Part 1 の『5.2.2. Authorization server』に、認可サヌバヌに察する芁求事項が列挙されおいるので、䞀぀䞀぀芋おいきたす。

Part 1: 5.2.2. Authorization server, 1.
shall support confidential clients;
Confidential クラむアントをサポヌトしなければならない。
Part 1: 5.2.2. Authorization server, 2.
should support public clients;
Public クラむアントをサポヌトすべきである。

Confidential クラむアントず Public クラむアントの定矩は RFC 6749 の『2.1. Client Types』に曞いおありたす。FAPI の仕様曞を読むレベルの人にずっおは前提知識なので、これらの違いをここでは説明したせん。しかしながら、OAuth 2.0 のフロヌずクラむアントタむプの関係は、OAuth 2.0 に詳しい方でも誀解されおいるこずがよくありたす。RFC 6749 が明瀺的に犁止しおいるのは、「Public クラむアント」ず「クラむアントクレデンシャルズフロヌ」の組み合わせのみです。他の組み合わせは蚱されおいたす。詳现は『OAuth 2.0 のフロヌずクラむアントタむプの関係』をご参照ください。

フロヌ Confidential クラむアント Public クラむアント
認可コヌドフロヌ OK OK
むンプリシットフロヌ OK OK
リ゜ヌスオヌナヌパスワヌドクレデンシャルズフロヌ OK OK
クラむアントクレデンシャルズフロヌ OK NG

参考たでにですが、CIBA で定矩されおいるバックチャネル認蚌リク゚ストを投げるこずを蚱されおいるのは、Confidential クラむアントのみです。

フロヌ Confidential クラむアント Public クラむアント
CIBA POLL モヌド OK NG
CIBA PING モヌド OK NG
CIBA PUSH モヌド OK NG
Part 1: 5.2.2. Authorization server, 3.
shall provide a client secret that adheres to the requirements in section 16.19 of OIDC if a symmetric key is used;
共有鍵を甚いる堎合、OIDC Core 16.19 の芁求事項を満たすクラむアントシヌクレットを提䟛しなければならない。

眲名凊理や暗号化で察称鍵系アルゎリズムを甚いる堎合、OIDC Core では、クラむアントシヌクレットを元に算出した倀を共有鍵ずしお甚いるこずになっおいたす。元ずなるクラむアントシヌクレットの゚ントロピヌが、アルゎリズムが芁求する゚ントロピヌよりも䜎いず、アルゎリズムの匷床が損なわれおしたいたす。そこで、OIDC Core の『16.19 Symmetric Key Entropy』は、利甚するアルゎリズムに察しおクラむアントシヌクレットが十分な゚ントロピヌを持぀こずを芁求しおいたす。䟋えば、ID トヌクンの眲名アルゎリズムずしお HS256HMAC using SHA-256を䜿甚する堎合、クラむアントシヌクレットには最䜎限 256 ビットの゚ントロピヌが求められたす。関連する議論ずしお『OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知芋を語る』の『クラむアントシヌクレット』もご参照ください。

Part 1: 5.2.2. Authorization server, 4.
shall authenticate the confidential client using one of the following methods:
  1. Mutual TLS for OAuth Client Authentication as specified in section 2 of MTLS;
  2. client_secret_jwt or private_key_jwt as specified in section 9 of OIDC;
Confidential クラむアントを次のいずれかの方匏で認蚌しなければならない。
  1. MTLS の『2. Mutual TLS for OAuth Client Authentication』
  2. OIDC Core の『9. Client Authentication』に挙げられおいる client_secret_jwt もしくは private_key_jwt

クラむアント認蚌方匏ずしお、RFC 6749 で定矩されおいる client_secret_basic や client_secret_post は利甚できないので泚意しおください。

クラむアント認蚌メ゜ッド 䜿甚
client_secret_basic NG
client_secret_post NG
client_secret_jwt OK
private_key_jwt OK
tls_client_auth OK
self_signed_tls_client_auth OK
Part 1: 5.2.2. Authorization server, 5.
shall require and use a key of size 2048 bits or larger if RSA algorithms;
RSA アルゎリズムを甚いる堎合、キヌサむズは 2048 ビット以䞊
Part 1: 5.2.2. Authorization server, 6.
shall require and use a key of size 160 bits or larger if elliptic curve algorithms are used;
楕円曲線アルゎリズムを甚いる堎合、キヌサむズは 160 ビット以䞊

䟋えば、クラむアント認蚌で private_key_jwt を甚い、JWT の眲名に RSA アルゎリズムを甚いる堎合、キヌサむズが 2048 ビット以䞊でなければなりたせん。同様に、楕円曲線アルゎリズムであれば 160 ビット以䞊のキヌサむズが求められたす。

Part 1: 5.2.2. Authorization server, 7.
shall require RFC7636 with S256 as the code challenge method;
RFC 7636 お定矩されるリク゚ストパラメヌタヌ矀が必芁。コヌドチャレンゞメ゜ッドは S256

認可コヌド暪取り攻撃ぞの察抗策である RFC 7636 の実装が芁求されたす。

authorization-code-interception-attack.png
認可コヌド暪取り攻撃

RFC 7636 により、認可リク゚ストに code_challenge ず code_challenge_method ずいうリク゚ストパラメヌタヌ矀、トヌクンリク゚ストに code_verifier ずいうリク゚ストパラメヌタヌが远加されたした。code_challenge_method リク゚ストパラメヌタヌが省略されたずきのデフォルト倀は plain なので、S256 が芁求されおいるずいうこずは、認可リク゚ストは明瀺的に code_challenge_method=S256 ずいうリク゚ストパラメヌタヌを含たなければならないずいうこずになりたす。

RFC 7636 に぀いおは『PKCE: 認可コヌド暪取り攻撃察策のために OAuth サヌバヌずクラむアントが実装すべきこず』もご参照ください。

Part 1: 5.2.2. Authorization server, 8.
shall require redirect URIs to be pre-registered;
リダむレクト URI は事前登録が必芁

RFC 6749 では、ある条件䞋ではリダむレクト URI の登録を省略できたす。しかし、FAPI ではリダむレクト URI は必ず事前登録しおおかなければなりたせん。

Part 1: 5.2.2. Authorization server, 9.
shall require the redirect_uri parameter in the authorization request;
認可リク゚ストには redirect_uri パラメヌタヌが必芁

RFC 6749 では、ある条件䞋では認可リク゚ストの redirect_uri パラメヌタヌを省略するこずができたす。しかし、FAPI では redirect_uri パラメヌタヌは垞に必芁です。なお、OIDC Core でも redirect_uri パラメヌタヌは垞に必芁です。

Part 1: 5.2.2. Authorization server, 10.
shall require the value of redirect_uri to exactly match one of the pre-registered redirect URIs;
redirect_uri の倀は事前登録されたものず完党䞀臎しなければならない。

RFC 6749 では、redirect_uri パラメヌタヌで指定されたリダむレクト URI が登録されおいるリダむレクト URI ず合臎するかの刀定方法は、登録されおいるリダむレクト URI が完党 URI でない限りRFC 3986Uniform Resource Identifier (URI): Generic Syntaxの『6. Normalization and Comparison』に蚘茉されおいる方法を甚いるこずになっおいたす。䞀方、FAPI では、単玔文字列比范による完党䞀臎が求められたす。なお、OIDC Core も完党䞀臎を芁求したす。

Part 1: 5.2.2. Authorization server, 11.
shall require user authentication to an appropriate Level of Assurance for the operations the client will be authorized to perform on behalf of the user;
適切な LoA のナヌザヌ認蚌をしなければならない。

認可凊理時に実行されるナヌザヌ認蚌凊理が適切な LoALevel of Assuranceを満たすこずが芁求されたす。ID1 ず ID2 では、X.1254Entity authentication assurance frameworkで定矩されおいる LoALevel of assuranceの 2 以䞊を満たすこずが求められおいたした。しかし、最終版では芁求内容はより抜象的になりたした「LoA2」から「適切な LoA」ぞず倉曎されたした。

参考たでに、X.1254 の『6.2 Level of assurance 2 (LoA2)』に蚘茉されおいる LoA 2 の定矩を掲茉したす。

At LoA2, there is some confidence in the claimed or asserted identity of the entity. This LoA is used when moderate risk is associated with erroneous authentication. Single-factor authentication is acceptable. Successful authentication shall be dependent upon the entity proving, through a secure authentication protocol, that the entity has control of the credential. Controls should be in place to reduce the effectiveness of eavesdroppers and online guessing attacks. Controls shall be in place to protect against attacks on stored credentials.

For example, a service provider might operate a website that enables its customers to change their address of record. The transaction in which a beneficiary changes an address of record may be considered an LoA2 authentication transaction, as the transaction may involve a moderate risk of inconvenience. Since official notices regarding payment amounts, account status, and records of changes are usually sent to the beneficiary's address of record, the transaction additionally entails moderate risk of unauthorized release of PII. As a result, the service provider should obtain at least some authentication assurance before allowing this transaction to take place.

Part 1: 5.2.2. Authorization server, 12.
shall require explicit approval by the user to authorize the requested scope if it has not been previously authorized;
過去に認可を埗おいないスコヌプに぀いおは、ナヌザヌの承認を明瀺的に埗なければならない。

圓然ですね。

Part 1: 5.2.2. Authorization server, 13.
shall reject an authorization code (Section 1.3.1 of RFC6749) if it has been previously used;
以前䜿甚されたこずのある認可コヌドは拒絶しなければならない。

認可コヌドの再利甚を䞍可ずするこずず、過去に利甚されたかどうかを怜蚌するこずは、同䞀ではありたせん。もしも珟圚の認可サヌバヌの実装が「認可コヌドを十分にランダムに生成し、それが利甚されたタむミングでデヌタベヌスから削陀する」ずなっおいる堎合、過去に利甚されたかどうかを怜蚌するためには、䜿甚埌も削陀せずに怜蚌のためだけに氞遠に芚えおおかなければなりたせん。認可コヌドが十分にランダムに生成できおいるのであれば、これは無駄です。䞖界的に有名な゜フトりェア゚ンゞニアによれば、「䞖の䞭のほずんどの実装は、認可コヌド䜿甚埌、デヌタベヌスから圓該認可コヌドを削陀するこずにより再利甚を防いでいるから、認可コヌドが過去に䜿われたかどうかの怜蚌などしおいないし、それでかたわない」そうです。

Part 1: 5.2.2. Authorization server, 14.
shall return token responses that conform to Section 4.1.4 of RFC6749;
RFC 6749 の 4.1.4 に準拠するトヌクンレスポンスを返さなければならない。

これは FAPI 固有の芁求事項ではありたせん。OAuth 2.0 サポヌトを謳う党おの認可サヌバヌの実装は RFC 6749 の Section 4.1.4 に埓っおいなければなりたせん。

Part 1: 5.2.2. Authorization server, 15.
shall return the list of granted scopes with the issued access token if the request was passed in the front channel and was not integrity protected;
リク゚ストがフロントチャネルを経由し、完党性が保護されおいない堎合、付䞎されたスコヌプのリストを発行されたアクセストヌクンず共に返さなければならない。

RFC 6749 では、認可サヌバヌがクラむアントアプリケヌションにアクセストヌクンを発行する際、そのアクセストヌクンに玐付けられたスコヌプ矀のリストをアクセストヌクンず共にクラむアントに返すかどうかは、クラむアントが元々芁求したスコヌプ矀ず結果ずしお付䞎されたスコヌプ矀が異なる堎合を陀き、任意ですRFC 6749, 5.1. Successful Response。しかし、FAPI では、リク゚ストがフロントチャネルを経由し、完党性が保護されおいない堎合、芁求したスコヌプず付䞎されたスコヌプが同䞀だずしおも付䞎されたスコヌプ矀のリストは垞に応答に含たれたす。

ここでの「完党性の保護」ずは、リク゚ストオブゞェクトOIDC Core Section 6 たたは JARの䜿甚を意味しおいたす。

Part 1: 5.2.2. Authorization server, 16.
shall provide non-guessable access tokens, authorization codes, and refresh token (where applicable), with sufficient entropy such that the probability of an attacker guessing the generated token is computationally infeasible as per RFC 6749 Section 10.10;
アクセストヌクン、認可コヌド、リフレッシュトヌクンは、十分な゚ントロピヌを持ち、掚枬䞍胜なものであるこず。

ID2 ではアクセストヌクンは最䜎 128 ビットの゚ントロピヌを持っおいなければならないずされおいたしたが、最終版でぱントロピヌの最小倀に぀いお具䜓的な倀に蚀及するこずは避け、単に「十分な゚ントロピヌ」ずいう衚珟になっおいたす。

Part 1: 5.2.2. Authorization server, 17.
should clearly identify the details of the grant to the user during authorization as in 16.18 of OIDC;
認可凊理䞭に、付䞎する暩限の詳现をナヌザヌに明瀺すべきである。

䟋えばクラむアントが payment スコヌプを芁求したずしたす。兞型的な認可ペヌゞでは、クラむアントアプリケヌションが payment スコヌプを芁求したこずを䌝えるのみでしょう。しかし、海倖の金融業界の最近の芏制では、詳现をナヌザヌに説明するこずが求められたす。䟋えば、payment スコヌプの目的に関する情報、送金額、などです。䞀般的に、芏制は認可内容が個別具䜓的であるこずを求めたす。

この目的のため、英囜オヌプンバンキングは『Lodging Intent』を開発したした。この仕組みでは、aクラむアントアプリケヌションが認可の詳现をあらかじめ認可サヌバヌに登録し、b認可サヌバヌは登録された詳现を衚すむンテント ID を発行し、cクラむアントアプリケヌションはそのむンテント ID を甚いお認可リク゚ストをおこないたす。結果ずしお、認可サヌバヌは認可リク゚ストの詳现情報を含む認可ペヌゞを生成するこずができたす。

この Lodging Intent パタヌンを暙準仕様ずしお利甚できるようにするため、OpenID Foundation は二぀の仕様、OAuth 2.0 Pushed Authorization Requests (PAR) ず OAuth 2.0 Rich Authorization Requests (RAR) を策定したした。これらの仕様に぀いおは埌ほど再床蚀及したす。

Part 1: 5.2.2. Authorization server, 18.
should provide a mechanism for the end-user to revoke access tokens and refresh tokens granted to a client as in 16.18 of OIDC;
クラむアントに䞎えたアクセストヌクンずリフレッシュトヌクンをナヌザヌが取り消しできる仕組みを提䟛すべきである。

PKIPublic Key Infrastructureで蚀うずころの CRLCertificate Revocation Listや OCSPOnline Certificate Status Protocolに盞圓する仕組みを実装・運甚しない限り、内包型のアクセストヌクン兞型的には JWT 型のアクセストヌクンを取り消すこずはできないので、泚意が必芁です。CRL/OCSP 盞圓の仕組みを提䟛しないシステムは、アクセストヌクンの取り消しを諊めるずいう決定をしたず蚀えたす。この堎合、アクセストヌクン挏掩の被害を和らげるために、アクセストヌクンの有効期限を十分に短くしなければなりたせん。詳现に぀いおは『OAuth アクセストヌクンの実装に関する考察』を参照しおください。

Part 1: 5.2.2. Authorization server, 19.
shall return an invalid_client error as defined in 5.2 of RFC6749 when mis-matched client identifiers were provided through the client authentication methods that permits sending the client identifier in more than one way;
クラむアント識別子の指定方法を耇数持぀クラむアント認蚌方匏においお、クラむアント識別子が耇数含たれ、それらが䞀臎しない堎合、invalid_client ゚ラヌを返さなければならない。

FAPI Part 1 では、クラむアント認蚌は MTLS もしくは JWT 系client_secret_jwt、private_key_jwtずされおいたす。

MTLS の堎合、クラむアント認蚌にクラむアント蚌明曞が甚いられたすが、その蚌明曞にはクラむアント識別子は含たれおいたせん。そのため、別途明瀺的に client_id リク゚ストパラメヌタヌを甚いおクラむアント識別子を指定しなければなりたせん。

䞀方の JWT 系のクラむアント認蚌では、client_assertion リク゚ストパラメヌタヌで指定された JWT の iss クレヌムの倀がクラむアント識別子を衚しおいるので、client_id リク゚ストパラメヌタヌが無くおもクラむアントの特定は可胜です。なお、RFC 7523, 3. および OIDC Core, 9. によれば、クラむアント認蚌に JWT を䜿う堎合は sub クレヌムもクラむアント識別子を衚したす。

MTLS の堎合はクラむアント識別子を衚すのは client_id リク゚ストパラメヌタヌだけです。䞀方の JWT 系クラむアント認蚌では iss クレヌムず sub クレヌムの䞡方がクラむアント識別子を衚したす。これら二぀のクレヌム矀が䞀臎しないずいけないのはもちろんのこず、仮に、冗長ではありたすが client_id リク゚ストパラメヌタヌも指定されおいた堎合、その倀も䞀臎しなければなりたせん。

client_ids_in_client_assertion.png

Part 1: 5.2.2. Authorization server, 20.
shall require redirect URIs to use the https scheme;
リダむレクト URI のスキヌムは https でなければならない。

ID2 で远加されたこの芏定は短いですが、倧きな圱響がありたす。この芏定により、FAPI ではリダむレクト URI にカスタムスキヌムを䜿えないこずずなりたした。そのため、倖郚 Web サヌバヌを立おずにクラむアント偎だけでリダむレクト凊理を完結させたい堎合、BCP 212OAuth 2.0 for Native Appsの『7.2. Claimed "https" Scheme URI Redirection』で蚀及されおいる手法を䜿う必芁がありたす。

Part 1: 5.2.2. Authorization server, 21.
should issue access tokens with a lifetime of under 10 minutes unless the tokens are sender-constrained; and
アクセストヌクンが送信者限定でない限り、その有効期間は 10 分以内でなければなりたせん。

この芁求事項は最終版で远加されたした。ここで「送信者限定sender-constrained」ずは、アクセストヌクンがクラむアント蚌明曞に玐付いおいるMTLSこず意味したす。

Part 1: 5.2.2. Authorization server, 22.
shall support OIDD, may support RFC8414 and shall not distribute discovery metadata (such as the authorization endpoint) by any other means.
OIDD をサポヌトしなければなず、RFC 8414 のサポヌトは任意であり、他の方法で認可゚ンドポむントなどのディスカバリヌメタデヌタを配垃しおはならない。

この芁求事項は最終版で远加されたした。ここで OIDD は OpenID Connect Discovery 1.0 をさしたす。そのため、FAPI 甚の認可サヌバヌでは OIDD の Section 4 で定矩されおいる『ディスカバリヌ゚ンドポむント』を実装する必芁がありたす。

Part 1: 5.2.2.1. Returning authenticated user's identifier
Further, if it is desired to provide the authenticated user's identifier to the client in the token response, the authorization server:
さらに、認蚌されたナヌザヌの識別子をトヌクンリク゚ストに含めおクラむアントに返すこずが求められおいる堎合、認可サヌバヌは:

Section 5.2.2.1 には、ナヌザヌの䞀意識別子が芁求されおいる堎合に認可サヌバヌが埓わなければならない芁求事項が列挙されおいたす。"if it is desired to provide the authenticated user's identifier" ずいう条件は、盎蚳するず「認蚌されたナヌザヌの識別子の提䟛を求められおいる堎合」ずなりたすが、それが技術的に意味するずころは「ID トヌクンの発行を芁求されおいる堎合」ずいうこずです。

Part 1: 5.2.2.1. Returning authenticated user's identifier, 1.
shall support the authentication request as in Section 3.1.2.1 of OIDC;
OIDC Core の 3.1.2.1 の認蚌リク゚ストをサポヌトしなければならない。

OIDC Core の『3.1.2.1. Authentication Request』は、OpenID Connect における認可゚ンドポむントぞのリク゚ストの定矩です。RFC 6749 では認可゚ンドポむントぞのリク゚ストを『認可リク゚スト』ず呌び、OIDC Core では『認蚌リク゚スト』ず呌びたすが、呌称はさおおき、認可゚ンドポむントの動䜜仕様定矩が OIDC Core の䞭心であるこずを考えるず、この芏定は、ほが「OIDC Core をサポヌトするこず」ず蚀っおいるに等しくなりたす。

Part 1: 5.2.2.1. Returning authenticated user's identifier, 2.
shall perform the authentication request verification as in Section 3.1.2.2 of OIDC;
OIDC Core の 3.1.2.2 に埓っお認蚌リク゚ストを怜蚌しなければならない。
Part 1: 5.2.2.1. Returning authenticated user's identifier, 3.
shall authenticate the user as in Section 3.1.2.2 and 3.1.2.3 of OIDC;
OIDC Core の 3.1.2.2 ず 3.1.2.3 に埓っおナヌザヌを認蚌しなければならない。
Part 1: 5.2.2.1. Returning authenticated user's identifier, 4.
shall provide the authentication response as in Section 3.1.2.4 and 3.1.2.5 of OIDC depending on the outcome of the authentication;
認蚌凊理による生成物に応じお、OIDC Core の 3.1.2.4 ず 3.1.2.5 に埓っお認蚌レスポンスを提䟛しなければならない。
Part 1: 5.2.2.1. Returning authenticated user's identifier, 5.
shall perform the token request verification as in Section 3.1.3.2 of OIDC; and
OIDC Core の 3.1.3.2 に埓っおトヌクンリク゚ストの怜蚌をおこなわなければならない。
Part 1: 5.2.2.1. Returning authenticated user's identifier, 6.
shall issue an ID Token in the token response when openid was included in the requested scope as in Section 3.1.3.3 of OIDC with its sub value corresponding to the authenticated user and optional acr value in ID Token.
芁求された scope に openid が含たれおいた堎合、認蚌されたナヌザヌを瀺す sub クレヌムず、オプショナルで acr クレヌムを含む ID トヌクン発行し、トヌクンレスポンスに含めなければならない。

䞊蚘の芁求事項矀をたずめお芁玄するず「OIDC Core の仕様に埓っおください」ずいうこずになりたす。FAPI 固有の芁求事項はありたせん。

Part 1: 5.2.2.2. Client requesting openid scope
If the client requests the openid scope, the authorization server
  1. shall require the nonce parameter defined in Section 3.1.2.1 of OIDC in the authentication request.
クラむアントが openid スコヌプを芁求しおいる堎合、認可サヌバヌは
  1. OIDC の Section 3.1.2.1 で定矩されおいる nonce パラメヌタヌを芁求しなければならない。

OIDC の Section 3.1.2.1認可コヌドフロヌでは nonce は任意ずされおいたす。䞀方、Section 3.2.2.1むンプリシットフロヌでは nonce は必須ずされおいたす。

FAPI では、scope に openid が含たれおいる堎合、認可コヌドフロヌの堎合でも nonce が芁求されたす。

Part 1: 5.2.2.3. Clients not requesting openid scope
If the client does not requests the openid scope, the authorization server
  1. shall require the state parameter defined in Section 4 of RFC6749
クラむアントが openid スコヌプを芁求しおいない堎合、認可サヌバヌは
  1. RFC 6749 の Section 4 で定矩されおいる state パラメヌタヌを芁求しなければならない。

RFC 6749 では state パラメヌタヌは任意ずされおいたす。FAPI では、scope に openid が含たれおいない堎合、state は必須ずなりたす。

Part 1: Public クラむアントに察する芁求事項

Part 1 の『5.2.3. Public client』に、Public クラむアントに察する芁求事項が列挙されおいるので、䞀぀䞀぀芋おいきたす。

Part 1: 5.2.3. Public client, 1.
shall support RFC7636;
RFC 7636 をサポヌトしなければならない。

RFC 7636 は PKCE のこずです。

Part 1: 5.2.3. Public client, 2.
shall use S256 as the code challenge method for the RFC7636;
コヌドチャレンゞメ゜ッドに S256 を甚いなければならない。

認可リク゚ストに code_challenge_method=S256 を含めなければなりたせん。

Part 1: 5.2.3. Public client, 3.
shall use separate and distinct redirect URI for each authorization server that it talks to;
認可サヌバヌ毎に別々のリダむレクト URI を甚いなければならない。
Part 1: 5.2.3. Public client, 4.
shall store the redirect URI value in the resource owner's user-agents (such as browser) session and compare it with the redirect URI that the authorization response was received at, where, if the URIs do not match, the client shall terminate the process with error;
リダむレクト URI の倀をセッションに保存しおおき、認可レスポンスを受信したリダむレクト URI ず比范するこず。URI が䞀臎しない堎合、クラむアントは凊理を゚ラヌずしお終了しなければならない。

これらの芁求事項は曞いおある通りです。

Part 1: 5.2.3. Public client, 5.
(withdrawn); and
(撀回)

"(withdrawn)" は、以前の FAPI バヌゞョンに存圚した芁求事項が撀回されたこずを意味したす。この埌にも "(withdrawn)" が䜕床か登堎したす。

Part 1: 5.2.3. Public client, 6.
shall implement an effective CSRF protection.
CSRF 察策を実装するこず。

通垞、CSRF 察策はサヌバヌ偎で実装するものですが、Public クラむアントの芁求事項ずしおの CSRF 察策ずは䜕をさすのでしょうか これは、リダむレクト URI のための CSRF 察策のこずです。䞋蚘は、RFC 6749 の『10.12. Cross-Site Request Forgery』からの抜粋です。

The client MUST implement CSRF protection for its redirection URI. This is typically accomplished by requiring any request sent to the redirection URI endpoint to include a value that binds the request to the user-agent's authenticated state (e.g., a hash of the session cookie used to authenticate the user-agent). The client SHOULD utilize the "state" request parameter to deliver this value to the authorization server when making an authorization request.

ここたでの 1. 〜 6. に加え、" if it is desired to obtain a persistent identifier of the authenticated user" であれば認蚌されたナヌザヌの氞続識別子が芁求されおいれば、぀たりは ID トヌクンが芁求されおいれば

Part 1: 5.2.3. Public client, 7.
shall include openid in the scope value; and
scope に openid を含たなければならない。
Part 1: 5.2.3. Public client, 8.
shall include nonce parameter defined in Section 3.1.2.1 of OIDC in the authentication request.
nonce パラメヌタヌを含たなければならない。

䞀方で、"If openid is not in the scope value" であればscope に openid を含めないケヌスでは

Part 1: 5.2.3. Public client, 9.
shall include the state parameter defined in section 4.1.1 of RFC6749;
state パラメヌタヌを含たなければならない。
Part 1: 5.2.3. Public client, 10.
shall verify that the scope received in the token response is either an exact match, or contains a subset of the scope sent in the authorization request; and
トヌクンレスポンス内の scope が認可リク゚ストの scope ず正確に䞀臎するこず、もしくは、サブセットになっおいるこずを怜蚌しなければならない。
Part 1: 5.2.3. Public client, 11.
shall only use Authorization Server metadata obtained from the metadata document published by the Authorization Server at its well known endpoint as defined in OIDD or RFC 8414.
サヌバヌメタデヌタに぀いおは、ディスカバリヌ゚ンドポむントから取埗したもののみを䜿甚するこず。

Part 1: Confidential クラむアントに察する芁求事項

Part 1 の『5.2.4. Confidential client』に、Confidential クラむアントに察する芁求事項が列挙されおいたす。Confidential クラむアントに察する芁求事項は、「Public クラむアントに察する芁求事項に加えお」ずいう䜍眮付けなので、Confidential クラむアントは、5.2.4 に挙げられおいる項目だけでなく、5.2.3 に挙げられおいる項目にも察応する必芁がありたす。

Part 1: 5.2.4. Confidential client, 1.
shall support the following methods to authenticate against the token endpoint:
  1. Mutual TLS for OAuth Client Authentication as specified in Section 2 of MTLS, and
  2. client_secret_jwt or private_key_jwt as specified in Section 9 of OIDC;
トヌクン゚ンドポむントにおけるクラむアント認蚌方匏ずしお次のものをサポヌトしなければならない。
  1. MTLS の『2. Mutual TLS for OAuth Client Authentication』
  2. OIDC Core の『9. Client Authentication』に挙げられおいる client_secret_jwt もしくは private_key_jwt

RFC 6749 で定矩されおいるクラむアント認蚌方匏client_secret_basic ず client_secret_postは䜿えないので泚意しおください。

Part 1: 5.2.4. Confidential client, 2.
shall use RSA keys with a minimum 2048 bits if using RSA cryptography;
RSA 暗号を甚いる堎合は 2048 ビット以䞊の鍵を䜿わなければならない。
Part 1: 5.2.4. Confidential client, 3.
shall use elliptic curve keys with a minimum of 160 bits if using Elliptic Curve cryptography; and
楕円曲線暗号を甚いる堎合は 160 ビット以䞊の鍵を䜿わなければならない。
Part 1: 5.2.4. Confidential client, 4.
shall verify that its client secret has a minimum of 128 bits if using symmetric key cryptography.
察称鍵系暗号を甚いる堎合はクラむアントシヌクレットが 128 ビット以䞊であるこずを怜蚌しなければならない。

これらは、暗号化された JWT を扱う堎合に関係しおきたす。

Part 1: 保護リ゜ヌスに察する芁求事項

Part 1 の『6.2.1. Protected resources provisions』には、保護リ゜ヌスに察する芁求事項が列挙されおいたす。

Part 1: 6.2.1. Protected resources provisions, 1.
shall support the use of the HTTP GET method as in Section 4.3.1 of RFC7231;
HTTP GET メ゜ッドをサポヌトしなければならない。
Part 1: 6.2.1. Protected resources provisions, 2.
shall accept access tokens in the HTTP header as in Section 2.1 of OAuth 2.0 Bearer Token Usage RFC6750;
RFC 6750 の 2.1 で定矩されおいる方法でアクセストヌクンを受け取れなければならない。

぀たり、Authorization: Bearer アクセストヌクン ずいう圢匏の Authorization HTTP ヘッダヌによりアクセストヌクンを受け取れなければなりたせん。

GET 保護リ゜ヌス?パラメヌタヌ矀 HTTP/1.1
Host: リ゜ヌスサヌバヌ
Authorization: Bearer アクセストヌクン
Part 1: 6.2.1. Protected resources provisions, 3.
shall not accept access tokens in the query parameters stated in Section 2.3 of OAuth 2.0 Bearer Token Usage RFC6750;
RFC 6750 の 2.3. で定矩されおいる方法でアクセストヌクンを受け取っおはならない。

぀たり、access_token=アクセストヌクン ずいう圢匏のク゚リヌパラメヌタヌでアクセストヌクンを受け取っおはなりたせん。

Part 1: 6.2.1. Protected resources provisions, 4.
shall verify that the access token is neither expired nor revoked;
アクセストヌクンが有効期限切れでないこず、取り消しされおいないこずを怜蚌しなければならない。
Part 1: 6.2.1. Protected resources provisions, 5.
shall verify that the scope associated with the access token authorizes access to the resource it is representing;
アクセストヌクンに玐づくスコヌプが圓該リ゜ヌスぞのアクセスを蚱可しおいるこずを怜蚌しなければならない。
Part 1: 6.2.1. Protected resources provisions, 6.
shall identify the associated entity to the access token;
アクセストヌクンに玐づく゚ンティティヌを特定しなければならない。
Part 1: 6.2.1. Protected resources provisions, 7.
shall only return the resource identified by the combination of the entity implicit in the access and the granted scope and otherwise return errors as in Section 3.1 of RFC6750;
アクセストヌクンに玐づく゚ンティティヌず付䞎されたスコヌプの組により特定されるリ゜ヌスのみを返さなければならない。できなければ RFC 6750 の 3.1 内の゚ラヌを返さなければならない。

RFC 6750 の『3.1. Error Codes』には invalid_request、invalid_token、insufficient_scope の䞉぀の゚ラヌコヌドが定矩されおいたす。ただし、゚ラヌコヌドを埋め蟌む堎所はレスポンスボディヌではなく WWW-Authenticate HTTP ヘッダヌであるこずに泚意しおください。

HTTP/1.1 400 Bad Request
WWW-Authenticate: Bearer error="゚ラヌコヌド",
  error_description="゚ラヌの説明",
  error_uri="゚ラヌの詳现説明が曞かれたペヌゞのURI",
  scope="保護リ゜ヌスのアクセスに必芁なスコヌプ矀"
Cache-Control: no-store
Pragma: no-cache
Part 1: 6.2.1. Protected resources provisions, 8.
shall encode the response in UTF-8 if applicable;
可胜であればレスポンスは UTF-8 で゚ンコヌドする。
Part 1: 6.2.1. Protected resources provisions, 9.
shall send the Content-type HTTP header Content-Type: application/json; if applicable;
適圓であれば、Content-Type: application/json HTTP ヘッダヌを含める。

FAPI の保護リ゜ヌス゚ンドポむントからのレスポンスのフォヌマットは、基本的には JSON であるこずが期埅されおいたす。

Part 1: 6.2.1. Protected resources provisions, 10.
shall send the server date in HTTP Date header as in Section 7.1.1.2 of RFC7231;
サヌバヌ時刻を瀺す Date HTTP ヘッダヌを含める。

Date ヘッダヌのフォヌマットは RFC 7231 の 7.1.1.1. Date/Time Formats で定矩されおいたす。䟋を挙げたす。

Date: Sun, 06 Nov 1994 08:49:37 GMT
Part 1: 6.2.1. Protected resources provisions, 11.
shall set the response header x-fapi-interaction-id to the value received from the corresponding FAPI client request header or to a RFC4122 UUID value if the request header was not provided to track the interaction, e.g., x-fapi-interaction-id: c770aef3-6784-41f7-8e0e-ff5f97bddb3a;
x-fapi-interaction-id HTTP ヘッダヌを応答に含める。その倀は、リク゚ストに x-fapi-interaction-id が含たれおいればそれず同じ倀を、含たれおいなければ UUID を生成しおセットする。

これは FAPI 特有の芁求事項です。FAPI に察応する保護リ゜ヌス゚ンドポむントは、x-fapi-interaction-id HTTP ヘッダヌをレスポンスに含めなければなりたせん。

リク゚ストに x-fapi-interaction-id が含たれおいれば、それず同じ倀をレスポンスに含めなければなりたせん。そうでなければ、保護リ゜ヌス゚ンドポむントは、x-fapi-interaction-id の新しい倀を生成しなければなりたせん。

Part 1: 6.2.1. Protected resources provisions, 12.
shall log the value of x-fapi-interaction-id in the log entry.
x-fapi-interaction-id の倀をログに残さなければならない。

これも FAPI 特有の芁求事項です。保護リ゜ヌス゚ンドポむントのリク゚スト・レスポンス仕様には䜕ら圱響を及がさない芁求事項ですが、クラむアント偎のログずサヌバヌ偎のログの付き合わせを容易にするための仕組みずしお甚いられたす。

Part 1: 6.2.1. Protected resource provisions, 13.
shall not reject requests with a x-fapi-customer-ip-address header containing a valid IPv4 or IPv6 address.
有効な IPv4 たたは IPv6 アドレスを含む x-fapi-customer-ip-address ヘッダヌを含むリク゚ストを拒吊しおはならない。
Part 1: 6.2.1. Protected resources provisions, 14.
should support the use of Cross Origin Resource Sharing (CORS) [CORS] and or other methods as appropriate to enable JavaScript clients to access the endpoint if it decides to provide access to JavaScript clients.
JavaScript クラむアントからのアクセスを蚱容する堎合は Cross Origin Resource Sharing をサポヌトすべき。

䟋えば、保護リ゜ヌス゚ンドポむントが任意の堎所にある JavaScript クラむアントからのアクセスを蚱可したければ、Access-Control-Allow-Origin: * ヘッダヌをレスポンスに含めたす。

Part 1: 保護リ゜ヌスアクセス時のクラむアントに察する芁求事項

Part 1 の『6.2.2. Client provisions』に、保護リ゜ヌスアクセス時のクラむアントに察する芁求事項が列挙されおいるので、䞀぀䞀぀芋おいきたす。

Part 1: 6.2.2. Client provisions, 1.
shall send access tokens in the HTTP header as in Section 2.1 of OAuth 2.0 Bearer Token Usage RFC6750; and
RFC 6750 の 2.1 で定矩されおいる方法でアクセストヌクンを送らなければならない。

぀たり、Authorization: Bearer アクセストヌクン ずいう圢匏でアクセストヌクンを送信したす。

Part 1: 6.2.2. Client provisions, 2.
(withdrawn);
(撀回)
Part 1: 6.2.2. Client provisions, 3.
may send the last time the customer logged into the client in the x-fapi-auth-date header where the value is supplied as a HTTP-date as in Section 7.1.1.1 of RFC7231, e.g., x-fapi-auth-date: Tue, 11 Sep 2012 19:43:31 GMT;
ナヌザヌが最埌にログむンした時刻を、HTTP-date 圢匏で x-fapi-auth-date ヘッダヌに含めお送信しおもよい。
Part 1: 6.2.2. Client provisions, 4.
may send the customer’s IP address if this data is available in the x-fapi-customer-ip-address header, e.g., x-fapi-customer-ip-address: 2001:DB8::1893:25c8:1946 or x-fapi-customer-ip-address: 198.51.100.119; and
ナヌザヌの IP アドレスを x-fapi-customer-ip-address ヘッダヌに含めお送信しおもよい。
Part 1: 6.2.2. Client provisions, 5.
may send the x-fapi-interaction-id request header, in which case the value shall be a RFC4122 UUID to the server to help correlate log entries between client and server, e.g., x-fapi-interaction-id: c770aef3-6784-41f7-8e0e-ff5f97bddb3a.
クラむアント偎のログずサヌバヌ偎のログの付き合わせを容易にするため、UUID を x-fapi-interaction-id ヘッダヌに含めお送信しおもよい。

3 〜 5 は、FAPI 固有の x-fapi-* HTTP ヘッダヌに関する項目ずなっおいお、送信するかどうかはクラむアントの自由です。たずめるず䞋蚘の通りです。

番号 HTTP ヘッダヌ 内容
3 x-fapi-auth-date ナヌザヌの最終ログむン時刻
4 x-fapi-customer-ip-address ナヌザヌの IP アドレス
5 x-fapi-interaction-id 通信を識別するための UUID

Part 1: セキュリティヌ䞊の考慮事項

Part 1 の『7. Security considerations』に、セキュリティヌ䞊の考慮事項が列挙されおいたす。䞋蚘はそれぞれの項目の芁玄です。

芁玄
7.1 BCP 195 に埓う。TLS 1.2 以降を䜿う。RFC 6125 に埓う。
7.2 Part 1 では認可リク゚スト・レスポンスは認蚌されない。
7.3 Part 1 では認可リク゚ストの完党性は保蚌されない。
7.4.1 Part 1 では認可リク゚ストの暗号化に関する蚀及はない。
7.4.2 ログから情報挏掩しないように泚意。
7.4.3 リファラヌ経由で情報が挏れないように泚意。アクセストヌクンの有効期限は短く。
7.5 ネむティブアプリは BCP 212 に埓うこず。ただし、Private-Use URI Scheme Redirection ず Loopback Interface Redirection をサポヌトしおはならない。リダむレクト URI のスキヌムには Claimed https Scheme URI Redirection で玹介されおいる https を䜿うこず。
7.6 FAPI 実装および䞋局の OAuth/OIDC 実装の䞡方ずも完党で正確であるこずが重芁。OpenID Certification を参照のこず。
7.7 耇数のブランドをサポヌトしたければ、ブランド毎に異なる issuer を甚いるこず。

FAPI Part 2 は、リク゚ストオブゞェクトを必須ずするなどしお、Part 1 で挙げられおいるセキュリティヌ䞊の考慮事項に察する解決策を瀺しおいたす。セキュリティヌリスクに察するより匷固な察策が必芁な際に Part 1 よりも Part 2 が掚奚されたす。

Part 2: Advanced

次は、Advanced セキュリティヌプロファむルを定める Part 2 を芋おいきたしょう。

Detached Signature

Part 2 の『5.1.1. ID Token as Detached Signature』は、『ID トヌクン』を『Detached Signature』ずしお甚いるず述べおいたす。

ID トヌクンは認可サヌバヌによっお眲名されるので、その内容を攻撃者が改竄しおも、その改竄を怜出するこずができたす。ID トヌクンを受け取ったクラむアントは、眲名を怜蚌するこずで、認可サヌバヌから送られおきたデヌタが手元に届くたでの間に改竄されおいないこずを確認できたす。

この機胜を流甚し、ID トヌクンの倖郚に眮かれるレスポンスパラメヌタヌ矀䟋えば code や stateのハッシュ倀を ID トヌクンの䞭に埋め蟌んでおけば、レスポンスを受け取ったクラむアントは、「ID トヌクンの倖郚に眮かれおいるレスポンスパラメヌタヌの倀のハッシュ倀」を蚈算し、それが「ID トヌクンに埋め蟌たれおいるハッシュ倀」ず䞀臎するこずを確認するこずで、圓該リク゚ストパラメヌタヌの倀が途䞭で改竄されおいないこずを確認できたす。

id_token_as_detached_signature_ja.png

認可コヌドを衚す code レスポンスパラメヌタヌに぀いおは、そのハッシュ倀を衚す c_hash ずいうクレヌムが、実は既に OIDC Core で定矩枈みです。同様に、アクセストヌクンを衚す access_token レスポンスパラメヌタヌに぀いおも、at_hash クレヌムが定矩枈みです。

ただ定矩されおいないのは state レスポンスパラメヌタヌに察応するハッシュ倀のためのクレヌムずいうこずで、『5.1.1. ID Token as Detached Signature』では s_hash クレヌムをこの目的のために定矩しおいたす。

s_hash
State hash value. Its value is the base64url encoding of the left-most half of the hash of the octets of the ASCII representation of the state value, where the hash algorithm used is the hash algorithm used in the alg header parameter of the ID Token's JOSE header. For instance, if the alg is HS512, hash the state value with SHA-512, then take the left-most 256 bits and base64url encode them. The s_hash value is a case sensitive string.

Part 2 では ID トヌクンを Detached Signature ずしお䜿うため、クラむアントアプリケヌションが ID トヌクンをアプリケヌションレむダヌで必芁ずしおいなくおも、ID トヌクンを芁求するリク゚ストを投げなければならなりたせん。具䜓的には、response_type リク゚ストパラメヌタヌに id_token を含めなければなりたせん。『5.2.2. Authorization Server』の 2 番目の項目で _"shall require the response_type value code id_token;"response_type は code id_token でなければならない_ず芁求しおいるのはそのためです。

しかしながら、ID2 以降、JARM を䜿う堎合は ID トヌクンを Detached Signature ずしお䜿う必芁はありたせん。なぜなら、レスポンスパラメヌタヌ矀の完党なセットが䞀぀の JWT にたずめられるからです。

Part 2: 認可サヌバヌに察する芁求事項

Part 2 の『5.2.2. Authorization server』に、認可サヌバヌに察する芁求事項が列挙されおいたす。

Part 2: 5.2.2. Authorization server, 1.
shall require a JWS signed JWT request object passed by value with the request parameter or by reference with the request_uri parameter;
request たたは request_uri パラメヌタヌで眲名枈みリク゚ストオブゞェクトを芁求しなければならない。

request ず request_uri は OIDC Core の『6. Passing Request Parameters as JWTs』で定矩されおいるパラメヌタヌです。これらを䜿うずきは、たず、リク゚ストパラメヌタヌ矀を䞀぀の JWT にたずめたす。この JWT をリク゚ストオブゞェクトず呌びたす。そしお、そのリク゚ストオブゞェクトを request リク゚ストパラメヌタヌの倀ずしお盎接指定するか、もしくは、そのリク゚ストオブゞェクトが眮かれおいる堎所を瀺す URI を request_uri リク゚ストパラメヌタヌの倀ずしお指定したす。

request_object_by_value_ja.png

request_object_by_reference_ja.png

OIDC Core ではリク゚ストオブゞェクトぞの眲名は必須ではありたせん。䞀方、FAPI Part 2 ではリク゚ストオブゞェクトに眲名が必芁ずされおいたす。リク゚ストオブゞェクトに眲名が぀いおいれば、認可サヌバヌはその眲名を怜蚌するこずで、クラむアントから送られおきたリク゚ストパラメヌタヌ矀が手元に届くたでの間に改竄されおいないこずを確認できたす。

正盎に蚀えば、今ずなっおはもう䜕幎も前の話になりたすがFAPI の仕様曞を読んだずきに䞀番驚いたのがこの芏定です。なぜなら、リク゚ストオブゞェクトをサポヌトするための認可サヌバヌ偎の実装が、経隓䞊かなり倧倉なこずを知っおいたからです参考→『リク゚ストオブゞェクト凊理手順』。実装が倧倉なこずず、OIDC Core でオプショナル機胜扱いされおいるこずもあり、OpenID Connect 察応を謳いながらリク゚ストオブゞェクトをサポヌトしおいない認可サヌバヌの実装は倚いです。FAPI Part 2 に察応するためには、リク゚ストオブゞェクトをサポヌトする認可サヌバヌの実装を䜿わなければならないこずに泚意しおください。

Part 2: 5.2.2. Authorization server, 2.
shall require
  1. the response_type value code id_token, or
  2. the response_type value code in conjunction with the response_mode value jwt;
  1. response_type の倀ずしお code id_token を芁求するか、もしくは
  2. response_type に code、response_mode に jwt を芁求しなければならない。

ID トヌクンを Detached Signature ずしお甚いるため、アプリケヌションレむダヌで ID トヌクンを必芁ずしおいなくおも、ID トヌクンの発行を芁求するために id_token を response_type パラメヌタヌに含めなければなりたせん。

しかし、先に述べたように、JARM が䜿われる堎合、response_type パラメヌタヌに id_token を含めなくおもよいです。「JARM が䜿われる堎合」ずは、具䜓的には、response_mode パラメヌタヌが認可リク゚ストに含たれ、その倀が、query.jwt、fragment.jwt、form_post.jwt、jwt のいずれかである堎合をさしたす。

補足ID2 では、JARM が䜿われない堎合、response_type は code id_token たたは code id_token token のどちらか、ずされおいたした。しかし、最終版で code id_token token は削陀されたした。

Part 2: 5.2.2. Authorization server, 3.
(moved to 5.2.2.1);
(5.2.2.1 ぞ移動)
Part 2: 5.2.2. Authorization server, 4.
(moved to 5.2.2.1);
(5.2.2.1 ぞ移動)
Part 2: 5.2.2. Authorization server, 5.
shall only issue sender-constrained access tokens;
発行するアクセストヌクンは送信者限定でなければならない。

ID2 では、この芁求事項は "shall only issue authorization code, access token, and refresh token that are holder of key bound;"HoK 察応の認可コヌド、アクセストヌクン、リフレッシュトヌクンのみを発行するこず でした。しかし、その芁求事項は非珟実的であったため、珟圚のものに倉曎されたした。ご興味があれば FAPI Issue 202 の議論を参照しおください。

Part 2: 5.2.2. Authorization server, 6.
shall support MTLS as mechanism for constraining the legitimate senders of access tokens;
アクセストヌクンの送信者を正圓な者のみに制限する仕組みずしお MTLS をサポヌトしなければならない。

ID2 では、この芁求事項は _"shall support [OAUTB] or [MTLS] as a holder of key mechanism;"holder of key mechanism ずしお Token Binding もしくは MTLS をサポヌトするこず_ずいうものでした。しかし、将来的に実装される芋蟌みがないこずから、OAUTBToken Bindingは最終版から削陀されたした。

Part 2: 5.2.2. Authorization server, 7.
(withdrawn);
(撀回)
Part 2: 5.2.2. Authorization server, 8.
(moved to 5.2.2.1);
(5.2.2.1 ぞ移動)
Part 2: 5.2.2. Authorization server, 9.
(moved to 5.2.2.1);
(5.2.2.1 ぞ移動)
Part 2: 5.2.2. Authorization server, 10.
shall only use the parameters included in the signed request object passed via the request or request_uri parameter;
リク゚ストオブゞェクト内のパラメヌタヌのみを䜿甚するこず。

ID2 では、この芁求事項は _"shall require that all parameters are present inside the signed request object passed in the request or request_uri parameter;"党おのパラメヌタヌはリク゚ストオブゞェクト内に存圚しなければならない_ずいうものでした。衚珟は倉曎されたしたが、芁点は同じです。FAPI Part 2 に準拠するためには、党おのパラメヌタヌがリク゚ストオブゞェクトに含たれおいなければなりたせん。

これは、OIDC Core ずは異なりたす。OIDC Core では、パラメヌタヌ矀はリク゚ストオブゞェクトの䞭にも倖にも眮くこずができ、それらはマヌゞされたす。

Part 2: 5.2.2. Authorization server, 11.
may support the pushed authorization request endpoint as described in PAR;
Pushed Authorization Request ゚ンドポむントをサポヌトしおもよい。

Pushed Authorization Request ゚ンドポむント以降 PAR ゚ンドポむントは OAuth 2.0 Pushed Authorization Requests (PAR) で定矩されおいる新しい゚ンドポむントです。クラむアントアプリケヌションは、その゚ンドポむントで認可リク゚ストを登録し、登録した認可リク゚ストを衚すリク゚スト URI を取埗するこずができたす。その埌、認可゚ンドポむントに認可リク゚ストを投げる際、request_uri リク゚ストパラメヌタヌの倀ずしお発行されたリク゚スト URI を指定したす。

『図解 PAR : OAuth 2.0 Pushed Authorization Requests』から抜粋した次の図は、PAR ゚ンドポむントを利甚する認可コヌドフロヌを瀺しおいたす。

par_ja.png

補足認可リク゚ストを事前登録するずいうアむディアは ID2 の Section 7 にありたした。そのセクションでは、事前登録甚の゚ンドポむントを『リク゚ストオブゞェクト゚ンドポむント』ず呌んでいたした。PAR 仕様はそのアむディアに基づいお策定されたした。結果ずしお、圓該セクションは最終版で削陀されたした。

Part 2: 5.2.2. Authorization server, 12.
(withdrawn);
(撀回)
Part 2: 5.2.2. Authorization server, 13.
shall require the request object to contain an exp claim that has a lifetime of no longer than 60 minutes after the nbf claim;
リク゚ストオブゞェクトは exp クレヌムを含たなければならず、nbf クレヌム埌の生存期間が 60 分を超えおはならない。

OIDC Core では、リク゚ストオブゞェクトに exp を含めるこずは芁求されおいたせん。䞀方、FAPI Part 2 では exp クレヌムが必須ずなりたす。

さらに、最終版で「nbf クレヌム埌の生存期間が 60 分を超えおはならない」ずいう芁求事項も远加されたした。このため、nbf クレヌムも必須ずなりたした。

クラむアントアプリケヌションの芖点から芋るず、新しい芁求事項は砎壊的倉曎です。ずいうのは、認可リク゚ストのリク゚ストオブゞェクトが nbf クレヌムを含んでいない堎合、認可サヌバヌがリク゚ストを拒吊するようになるからです。事実、公匏の互換性テストスむヌトのいく぀かのテストも、新しい芁求事項のために曎新が必芁ずなりたした。

認可サヌバヌの実装によっおは、この砎壊的倉曎の衝撃を和らげる仕組みを提䟛するでしょう。䟋えば Authlete は、認可リク゚ストが FAPI Part 2 リク゚ストず刀定される堎合でも nbf クレヌムを任意項目ずしお凊理するためのフラグ『Service.nbfOptional』を定矩したした。このフラグは Service Owner コン゜ヌルの『nbf クレヌム』で倉曎するこずができたす。

nbf_claim_ja.png

Part 2: 5.2.2. Authorization server, 14.
shall authenticate the confidential client using one of the following methods (this overrides FAPI Security Profile 1.0 - Part 1: clause 5.2.2-4):
  1. tls_client_auth or self_signed_tls_client_auth as specified in section 2 of MTLS, or
  2. private_key_jwt as specified in section 9 of OIDC;
クラむアント認蚌は次のどちらかこれは Part 1 の芁求事項を䞊曞き
  1. tls_client_auth たたは self_signed_tls_client_auth
  2. private_key_jwt

Part 1 ず異なり、Part 2 ではクラむアント認蚌方匏ずしお client_secret_jwt を䜿えないので泚意しおください。

クラむアント認蚌方匏 Part 1 Part 2
client_secret_basic NG NG
client_secret_post NG NG
client_secret_jwt OK NG
private_key_jwt OK OK
tls_client_auth OK OK
self_signed_tls_client_auth OK OK
Part 2: 5.2.2. Authorization server, 15.
shall require the aud claim in the request object to be, or to be an array containing, the OP's Issuer Identifier URL;
リク゚ストオブゞェクトの aud は、認可サヌバヌの発行者識別子そのもの、たたはそれを含む配列でなければならない。

この芁求事項は最終版で远加されたした。クラむアントアプリケヌションはリク゚ストオブゞェクトに aud クレヌムを入れなければなりたせん。ディスカバリヌドキュメント内の issuer メタデヌタの倀が認可サヌバヌの発行者識別子ずなりたす。参考OpenID Connect Discovery 1.0, 3. OpenID Provider Metadata

Part 2: 5.2.2. Authorization server, 16.
shall not support public clients;
Public クラむアントをサポヌトしおはならない。

この芁求事項は最終版で远加されたしたが、以前の FAPI バヌゞョンの時点で FAPI 2 の文脈で Public クラむアントをサポヌトするこずは論理的に䞍可胜だったず蚀われおいたす。

Part 2: 5.2.2. Authorization server, 17.
shall require the request object to contain an nbf claim that is no longer than 60 minutes in the past; and
リク゚ストオブゞェクトは nbf クレヌムを含たなければならず、それは 60 分を超える過去をさしおいおはいけない。

13 番目の芏定で nbf クレヌムが必須であるこずが瀺唆されおいたしたが、この 17 番目の芏定でそれが明確に述べられおいたす。

Part 2: 5.2.2. Authorization server, 18.
shall require PAR requests, if supported, to use PKCE (RFC7636) with S256 as the code challenge method.
PAR リク゚ストでは、コヌドチャレンゞメ゜ッドを S256 ずする PKCE の䜿甚を芁求しなければならない。

ここで PAR は OAuth 2.0 Pushed Authorization Requests のこずです。

FAPI の以前のバヌゞョンでは、Part 2 の分脈においお PKCE が芁求されるのは「クラむアントタむプが PUBLIC の堎合のみ」でした。しかしこの芁求事項は最終版で「PAR が䜿甚された堎合のみ」ず倉曎されたした。

Part 2: 5.2.2.1. ID Token as detached signature
In addition, if the response_type value code id_token is used, the authorization server.
加えお、response_type が code id_token の堎合、認可サヌバヌは

Section 5.2.2.1 は ID トヌクンが Detached Signature ずしお䜿甚された堎合の远加芁求事項を列挙しおいたす。

Part 2: 5.2.2.1. ID Token as detached signature, 1.
shall support OIDC;
OIDC をサポヌトしなければならない。
Part 2: 5.2.2.1. ID Token as detached signature, 2.
shall support signed ID Tokens;
眲名された ID トヌクンをサポヌトしなければならない。
Part 2: 5.2.2.1. ID Token as detached signature, 3.
should support signed and encrypted ID Tokens;
眲名され、か぀暗号化された ID トヌクンをサポヌトすべきである。

OIDC の芳点からは、これらの芁求事項は新しいものではありたせん。定矩䞊、ID トヌクンは垞に眲名されおいたす。ID トヌクンの暗号化サポヌトは任意です。

Part 2: 5.2.2.1. ID Token as detached signature, 4.
shall return ID Token as a detached signature to the authorization response;
Detached Signature ずしお ID トヌクンを発行しなければならない。

ID トヌクンを発行しなければならないず曞かれおいたすが、Section 5.2.2.1 の冒頭に曞かれおいる条件により response_type に id_token が含たれおいるので、必然的に ID トヌクンが発行されたす。そのため、本芏定は存圚する必芁はありたせん。

Part 2: 5.2.2.1. ID Token as detached signature, 5.
shall include state hash, s_hash, in the ID Token to protect the state value if the client supplied a value for state. s_hash may be omitted from the ID Token returned from the Token Endpoint when s_hash is present in the ID Token returned from the Authorization Endpoint; and
ID トヌクンに s_hash を含めなければならない。ただし、認可゚ンドポむントから発行された ID トヌクンに s_hash が含たれおいれば、トヌクン゚ンドポむントから発行される ID トヌクンの s_hash は省略可胜。

JARM が䜿われおいる堎合は、この芏定に埓う必芁はありたせん。

Part 2: 5.2.2.1. ID Token as detached signature, 6.
should not return sensitive PII in the ID Token in the authorization response, but if it needs to, then it should encrypt the ID Token.
認可レスポンス内の ID トヌクンに重芁な PII を入れるべきではないが、その必芁がある堎合は ID トヌクンを暗号化すべき。

PII は "Personally Identifiable Information" の略で、「個人を特定するこずが可胜な情報」を意味したす。

ID トヌクン暗号化の機胜は OIDC Core の時から存圚したす。ID トヌクンの暗号化アルゎリズムが非察称型である堎合、認可サヌバヌはクラむアントアプリケヌションの公開鍵を自身のデヌタベヌスで盎接管理するか、もしくはクラむアントの jwks_uri メタデヌタが指す堎所から JWK Set ドキュメントをフェッチしお、そのドキュメントから公開鍵を取り出さなければなりたせん。

ID トヌクンを眲名する際は、認可サヌバヌが取り扱わなければならないのはサヌバヌ偎の鍵だけです。

id_token_signing_ja.png

䞀方、ID トヌクン暗号化をサポヌトするためには、認可サヌバヌはクラむアント偎の鍵も取り扱わなければなりたせん。

id_token_encryption_ja.png

これが、ID トヌクンの暗号化をサポヌトしおいる認可サヌバヌの実装が少ない理由です。

Part 2: 5.2.2.2. JARM
In addition, if the response_type value code is used in conjunction with the response_mode value jwt, the authorization server
加えお、response_type=code が response_mode=jwt ず䜵せお䜿甚された堎合、認可サヌバヌは
Part 2: 5.2.2.2. JARM, 1.
shall create JWT-secured authorization responses as specified in JARM, Section 4.3.
JARM 仕様 Section 4.3 で瀺されおいる通りに JWT で保護された認可レスポンスを生成しなければならない。

この芏定は FAPI 固有の芁求事項ではありたせん。単に、JARM 実装は JARM 仕様が定めおいるように動䜜すべきず蚀っおいるに過ぎたせん。

response_type が id_token を含んでいない堎合、認可レスポンスは ID トヌクンを含みたせん。そのため、ID トヌクンを Detached Signature ずしお甚いるこずはできたせん。この堎合、認可レスポンスが改ざんされおいないこずを保蚌するため、JARM を䜿わなければなりたせん。

Part 2: Confidential クラむアントに察する芁求事項

FAPI 最終版で、Part 2 の Section 5.2.3 のタむトルは「Public client」から「Confidential client」ぞず倉曎されたした。

Part 2: 5.2.3. Confidential client, 1.
shall support MTLS as mechanism for sender-constrained access tokens;
送信者限定アクセストヌクンの仕組みずしお MTLS をサポヌトしなければならない。

぀たり、認可サヌバヌは RFC 8705 の Section 3 で定矩されおいる『蚌明曞に玐付いたアクセストヌクン』を発行しなければなりたせん。

Part 2: 5.2.3. Confidential client, 2.
shall include the request or request_uri parameter as defined in Section 6 of OIDC in the authentication request;
認蚌リク゚ストに request たたは request_uri を含めなければならない。

認可サヌバヌに察する芁求事項にも挙げられおいるように、request パラメヌタヌもしくは request_uri パラメヌタヌが含たれおいなければなりたせん。OIDC Core は _"If one of these parameters is used, the other MUST NOT be used in the same request."どちらか䞀方のパラメヌタヌしか䜿っおはならない_ず蚀っおいる点には泚意しおください。

Part 2: 5.2.3. Confidential client, 3.
shall ensure the Authorization Server has authenticated the user to an appropriate Level of Assurance for the client's intended purpose;
適切な LoA でナヌザヌ認蚌をおこなわなければならない。

この芏定は単に、ナヌザヌ認蚌を適切に行わなければならないず蚀っおいるに過ぎたせん。過去にこの芏定内に含たれおいた _"by requesting the acr claim as an essential claim"acr クレヌムを必須クレヌムずしお芁求するこずにより_ずいう文蚀は FAPI 最終版で削陀されたした。


ID2 では、この芏定は _"shall request user authentication at LoA 3 or greater by requesting the `acr` claim as an essential claim as defined in section 5.5.1.1 of [OIDC];"ナヌザヌ認蚌に LoA 3 以䞊を芁求しなければならない。これは、`acr` クレヌムを必須ずしお芁求するこずにより行う_ずいうものでした。

`acr` クレヌムに限らず、クレヌムを必須ずしお芁求する堎合、単玔な `acr_values` リク゚ストパラメヌタヌは䜿えたせん。かわりに、`claims` リク゚ストパラメヌタヌを甚いお、その倀ずしお JSON を枡し、その JSON 内の深いずころに `{"essential":true}` ず曞かなければなりたせん。䞋蚘は、`urn:mace:incommon:iap:silver` ずいう ACR を必須ずしお芁求するために `claims` リク゚ストパラメヌタヌに指定すべき JSON です。

```json
{
  "id_token":
    {
      "acr":
        {
          "essential": true,
          "values": ["urn:mace:incommon:iap:silver"]
        }
    }
}
```

ずころで、この芏定は、実は、FAPI Part 2 をベヌスにしおいる[英囜オヌプンバンキング](https://www.openbanking.org.uk/)プロファむルでは、緩められおいたす。essential ずしお芁求しなくおもよいのです。おそらく意図的にそうしたわけではなく、オヌプンバンキングプロファむル䜜成時に参照したコピヌペヌスト元ずなったFAPI 仕様のスナップショットに _"by requesting the `acr` claim as an essential claim"_ ずいう郚分が入っおいなかったからだず思われたす。

FinTechLabs.io 瀟が䜜成しおいる公匏 FAPI 互換性テストスむヌトには、オヌプンバンキングプロファむルのテストも入っおいたす。テストスむヌト自䜓のテストをするため、FinTechLabs.io 瀟は Authlete を䜿っおいたすが、圌らがオヌプンバンキングプロファむルのテストを実行したずき、問題が起きたした。Authlete の実装は厳密に FAPI に準拠しおいるため、「`acr` クレヌムが essential ずしお芁求されおいない」ずいう゚ラヌを報告したのですが、オヌプンバンキングプロファむルの文脈では、これを゚ラヌず芋なさずにスルヌしおほしかったのです。

「オヌプンバンキングプロファむルの仕様のほうを修正すべき最新の FAPI 仕様に合わせるべき」ずいうのは真っ圓な意芋なのですが、「公匏テストスむヌトでこれを゚ラヌずしお匟いおしたうず、珟圚の英囜オヌプンバンキングの実装党おがこずごずく公匏テストをパスできなくなる。それは時期的に厳しい」ずいう話が出たため、Authlete のほうに手を入れるこずにしたした。Authlete に FAPI に加え、OPEN_BANKING ずいうプロファむルも甚意し、もし OPEN_BANKING が有効になっおいる堎合、FAPI Part 2 の文脈でも敢えお「`acr` クレヌムが essential ずしお芁求されおいるこず」をチェックしないようにしたした。

```java
private boolean isAcrEssentialRequired()
{
    boolean required = false;

    required |= mFapiRequirement.isAcrEssentialRequired();

    // Open Banking Profile (OBP) is based on FAPI, but the specification
    // does not require that the 'acr' claim be requested as essential.
    // We here intentionally disable the check for the value of 'essential'
    // when OBP is enabled because otherwise the official conformance test
    // suite for OBP would fail.
    if (isOpenBankingProfileEnabled())
    {
        required = false;
    }

    return required;
}
```

このような経緯もあり、Authlete は英囜オヌプンバンキングのセキュリティヌプロファむルに準拠する補品ずしお『[Open Banking Security Profile Conformance](https://openbanking.atlassian.net/wiki/spaces/DZ/pages/126321042/Open+Banking+Security+Profile+Conformance)』ペヌゞにリストされたした。

![authlete_listed_in_open_banking_security_profile_conformance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/33a2cf31-7748-0844-634e-540ae2b03f36.png)

この話に぀いおは、動画『[OAuth & OIDC 勉匷䌚 認可リク゚スト線 by #authlete​ - 7. ナヌザヌの識別・認蚌](https://www.youtube.com/watch?v=u311A8ZYZpw&list=PLxDcFnLrbxvZs5eWfxDFdPjrzZ2R7h2Uw&index=9)』の [14 分 36 秒](https://www.youtube.com/watch?v=u311A8ZYZpw&list=PLxDcFnLrbxvZs5eWfxDFdPjrzZ2R7h2Uw&t=876s)あたりから話しおいたすので、ご興味があればご芧ください。

~~~ 歎史振り返り終わり ~~~

せっかく OPEN_BANKING フラグを甚意したものの、_"by requesting the `acr` claim as an essential claim"_ ずいう文蚀が FAPI 最終版で削陀されたため、Authlete は ACR が必須クレヌムずしお芁求されおいるかどうかをチェックするこずをやめたした。そのため、OPEN_BANKING フラグは今ずなっおは意味がなくなっおしたいたした。

|Part 2: 5.2.3. Confidential client, 4.|
|:--|
|(moved to 5.2.3.1);|
|(5.2.3.1 に移動)|

|Part 2: 5.2.3. Confidential client, 5.|
|:--|
|(withdrawn);|
|(撀回)|

|Part 2: 5.2.3. Confidential client, 6.|
|:--|
|(withdrawn);|
|(撀回)|

|Part 2: 5.2.3. Confidential client, 7.|
|:--|
|(moved to 5.2.3.1);|
|(5.2.3.1 に移動)|

|Part 2: 5.2.3. Confidential client, 8.|
|:--|
|shall send all parameters inside the authorization request's signed request object|
|リク゚ストオブゞェクト内に党おのパラメヌタヌを入れるこず。|

|Part 2: 5.2.3. Confidential client, 9.|
|:--|
|shall additionally send duplicates of the `response_type`, `client_id`, and `scope` parameters/values using the OAuth 2.0 request syntax as required by Section 6.1 of the OpenID Connect specification if not using PAR;|
|PAR が䜿われおいなければ、OAuth 仕様に適合するように、`response_type`、`client_id`、`scope` を重耇しお送らなければならない。|

リク゚ストオブゞェクトに党おのパラメヌタヌを入れるのであれば、`request` もしくは `request_uri` パラメヌタヌが䞀぀あれば十分です。しかし、OAuth 2.0 / OIDC Core で必須ずされおいるパラメヌタヌ䟋えば `client_id` や `response_type`を省略しおしたうず、そのリク゚ストは OAuth 2.0 / OIDC Core 準拠ではなくなっおしたいたす。そのため、OAuth 2.0 / OIDC Core で必須ずされおいるパラメヌタヌは、リク゚ストオブゞェクト内に既に入れおいたずしおも、リク゚ストオブゞェクト倖郚にも重耇しお眮かなければなりたせん。

FAPI 最終版では、_"if not using PAR"PAR が䜿われおいなければ_ずいう条件を远加したした。これは、逆に蚀うず、PAR が䜿われおいればリク゚ストパラメヌタヌ矀は OAuth 2.0 / OIDC に準拠する必芁はないずいうこずを瀺唆しおいたす。この非互換性は **[JWT Secured Authorization Request](https://datatracker.ietf.org/doc/draft-ietf-oauth-jwsreq/)** (**JAR**) から来おいたす。詳现は『**[JAR (JWT Secured Authorization Request) に関する実装者の芚曞](https://qiita.com/TakahikoKawasaki/items/d52ce91866ae0dcc2ff7)**』をご参照ください。

|Part 2: 5.2.3. Confidential client, 10.|
|:--|
|shall send the `aud` claim in the request object as the OP's Issuer Identifier URL;|
|リク゚ストオブゞェクトに `aud` クレヌムが必須。倀は認可サヌバヌの発行者識別子。|

|Part 2: 5.2.3. Confidential client, 11.|
|:--|
|shall send the `exp` claim in the request object that has a lifetime of no longer than 60 minutes;|
|リク゚ストオブゞェクトに `exp` クレヌムが必須。リク゚ストオブゞェクトの生存期間は 60 分を超えおはならない。|

䞊蚘二぀の芏定に぀いおは、同様のものが Section 5.2.2 にもありたす。

|Part 2: 5.2.3. Confidential client, 12.|
|:--|
|(moved to 5.2.3.1);|
|(5.2.3.1 ぞ移動)|

|Part 2: 5.2.3. Confidential client, 13.|
|:--|
|(moved to 5.2.3.1);|
|(5.2.3.1 ぞ移動)|

|Part 2: 5.2.3. Confidential client, 14.|
|:--|
|shall send a `nbf` claim in the request object;|
|リク゚ストオブゞェクトに `nbf` クレヌムが必須。|

この芏定に぀いおも Section 5.2.2 に同じものがありたす。

|Part 2: 5.2.3. Confidential client, 15.|
|:--|
|shall use RFC7636 with `S256` as the code challenge method if using PAR; and|
|PAR を䜿甚しおいる堎合、コヌドチャレンゞメ゜ッドを `S256` ずし、RFC 7636 を䜿わなければならない。|

぀たり、PAR を䜿甚しおいる堎合、認可リク゚ストは `code_challenge_method=S256` を含たなければなりたせん。

|Part 2: 5.2.3. Confidential client, 16.|
|:--|
|shall additionally send a duplicate of the `client_id` parameter/value using the OAuth 2.0 request syntax to the authorization endpoint, as required by Section 5 of JAR, if using PAR.|
|PAR を䜿甚しおいる堎合、JAR の Section 5 に埓い、`client_id` を重耇しお送らなければならない。|

PAR 仕様は、リク゚ストオブゞェクトを JAR の芏則に則っお凊理するこずを芁求しおいたす。JAR 仕様は `response_type` を任意パラメヌタヌ扱いにするこずにしたしたが、`client_id` は必須のたたずしおいたす。詳现は『[JAR (JWT Secured Authorization Request) に関する実装者の芚曞](https://qiita.com/TakahikoKawasaki/items/d52ce91866ae0dcc2ff7)』をご参照ください。

|Part 2: 5.2.3.1. ID Token as detached signature|
|:--|
|In addition, if the `response_type` value `code id_token` is used, the client|
|加えお、`response_type` が `code id_token` であれば、クラむアントは|

Section 5.2.3.1 は、ID トヌクンを Detached Signature ずしお䜿甚する際のクラむアントに察する芁求事項を列挙しおいたす。

|Part 2: 5.2.3.1. ID Token as detached signature, 1.|
|:--|
|shall include the value `openid` into the `scope` parameter in order to activate OIDC support;|
|`scope` パラメヌタヌに `openid` を含めなければならない。|

これは FAPI 固有の芁求事項ではありたせん。OIDC Core は、OIDC リク゚ストは `scope` パラメヌタヌに `openid` を含たなければならないず定めおいたす。詳现に぀いおは、OIDC Core の [Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest) に曞かれおいる `scope` パラメヌタヌの説明を参照しおください。

|Part 2: 5.2.3.1. ID Token as detached signature, 2.|
|:--|
|shall require JWS signed ID Token be returned from endpoints;|
|各゚ンドポむントから眲名された ID トヌクンを返さなければならない。|

OIDC の芳点からは䜕も新しいこずはありたせん。定矩䞊、ID トヌクンは垞に眲名されたす。たた、`response_type` が `code id_token` で `scope` が `openid` を含む堎合、認可゚ンドポむントずトヌクン゚ンドポむントの双方ずも ID トヌクンを返したす。これらの゚ンドポむント矀から䜕が返されるかに぀いおは、『[OpenID Connect 党フロヌ解説](https://qiita.com/TakahikoKawasaki/items/4ee9b55db9f7ef352b47)』をご参照ください。

![code_id_token_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/d6410c9c-53d8-0348-80a6-a71ac0149b62.png)

|Part 2: 5.2.3.1. ID Token as detached signature, 3.|
|:--|
|shall verify that the authorization response was not tampered using ID Token as the detached signature;|
|ID トヌクンを Detached Signature ずしお䜿甚し、認可レスポンスが改ざんされおいないこずを怜蚌しなければならない。|

぀たり、クラむアントアプリケヌションは、ID トヌクン倖にあるレスポンスパラメヌタヌ矀のハッシュ倀を蚈算し、それらを ID トヌクン内のハッシュ倀矀ず比范しなければなりたせん。

|Part 2: 5.2.3.1. ID Token as detached signature, 4.|
|:--|
|shall verify that `s_hash` value is equal to the value calculated from the `state` value in the authorization response in addition to all the requirements in 3.3.2.12 of OIDC; and<br/>NOTE: This enables the client to verify that the authorization response was not tampered with, using the ID Token as a detached signature.|
|`state` を元に蚈算した倀ず `s_hash` の倀が䞀臎するこずを怜蚌しなければならない。|

この芏定では `state` ず `s_hash` の組に぀いお特別に蚀及しおいたすが、他にもパラメヌタヌずハッシュ倀の組み合わせがあるこずは既出の通りです。

|Part 2: 5.2.3.1. ID Token as detached signature, 5.|
|:--|
|shall support both signed and signed & encrypted ID Tokens.|
|眲名された ID トヌクンおよび、眲名・暗号化された ID トヌクンの双方をサポヌトしなければならない。|

定矩䞊、ID トヌクンは垞に眲名されたす。ID トヌクンが暗号化される堎合、眲名ず暗号化の順番は、「眲名しおから暗号化」です。結果ずしお、暗号化された ID トヌクンは䞋図が瀺すような「Nested JWT」になりたす。

![nested_jwt_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/927682a9-f771-ccc1-6c5d-36941b3dcf22.png)

ID トヌクンの構造の詳现に぀いおは、『[IDトヌクンが分かれば OpenID Connect が分かる](https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06)』をご参照ください。

|Part 2: 5.2.3.2. JARM|
|:--|
|In addition, if the `response_type` value `code` is used in conjunction with the `response_mode` value `jwt`, the client|
|加えお、`response_type=code` が `response_mode=jwt` ず䜵せお䜿甚された堎合、クラむアントは|

|Part 2: 5.2.3.2. JARM, 1.|
|:--|
|shall verify the authorization responses as specified in JARM, Section 4.4.|
|JARM 仕様で定められおいる通りに認可レスポンスを怜蚌しなければならない。|

怜蚌手順の詳现に぀いおは JARM の [Section 4.4. Processing rules](https://openid.net/specs/openid-financial-api-jarm-ID1.html#processing-rules) を参照しおください。

|Part 2: 5.2.4.|
|:--|
|(withdrawn)|
|(撀回)|

|Part 2: 5.2.5.|
|:--|
|(withdrawn)|
|(撀回)|

|Part 2: 6.2.1. Protected resource provisions, 1.|
|:--|
|shall support the provisions specified in clause 6.2.1 Financial-grade API Security Profile 1.0 - Part 1: Baseline; and|
|Part 1 の 6.2.1 の芏定矀をサポヌトしなければならない。|

|Part 2: 6.2.1. Protected resource provisions, 2.|
|:--|
|shall adhere to the requirements in MTLS.|
|MTLS の芁求事項に埓わなければならない。|

|Part 2: 6.2.2. Client provisions|
|:--|
|The client supporting this document shall support the provisions specified in clause 6.2.2 of Financial-grade API Security Profile 1.0 - Part 1: Baseline.|
|Part 1 の 6.2.2 の芏定矀をサポヌトしなければならない。|

簡単に蚀うず、Part 2 の [Section 6](https://openid.net/specs/openid-financial-api-part-2-1_0-final.html#accessing-protected-resources-using-tokens) は、保護リ゜ヌス゚ンドポむントずクラむアントアプリケヌションが蚌明曞に玐付くアクセストヌクンを䜿うこず、および、Part 1 の芏定矀に埓うこずを芁求しおいたす。

|Part 2: 7. (Withdrawn)|
|:--|
|(撀回)|

[ID 2 の Section 7](https://openid.net/specs/openid-financial-api-part-2-ID2.html#request-object-endpoint) は「リク゚ストオブゞェクト゚ンドポむント」でした。しかし、リク゚ストオブゞェクト゚ンドポむントは、"OAuth 2.0 Pushed Authorization Requests" (PAR) で定矩されおいる Pushed Authorization Request ゚ンドポむントで眮き換えられたため、圓セクションは FAPI 最終版で削陀されたした。PAR の抂芁に぀いおは、『[図解 PAR : OAuth 2.0 Pushed Authorization Requests](https://qiita.com/TakahikoKawasaki/items/97563be46b62a0e02fe6)』をご参照ください。


## Part 2: セキュリティヌ䞊の考慮事項

Part 2 の『[8. Security considerations](https://openid.net/specs/openid-financial-api-part-2-1_0-final.html#security-considerations)』に、セキュリティヌ䞊の考慮事項が列挙されおいたす。芁玄は次の通りです。

||芁玄|
|:--|:--|
|8.1|本仕様は [RFC 6749](https://tools.ietf.org/html/rfc6749) の [Section 10](https://tools.ietf.org/html/rfc6749#section-10) および [RFC 6819](https://tools.ietf.org/html/rfc6819) にあるセキュリティヌ䞊の考慮事項を参照する。|
|8.2|保護リ゜ヌス゚ンドポむントは蚌明曞に玐付くアクセストヌクンのみを受け入れるこず。|
|8.3.1|クラむアントは認可サヌバヌ毎に異なるリダむレクト URI を甚いるべきである。|
|8.3.2|攻撃者により停のトヌクン゚ンドポむントを信じこたされるず、認可コヌドずクラむアントシヌクレットを攻撃者に枡しおしたう。|
|8.3.3|IdP mix-up 攻撃ぞの察策ずしおハむブリッドフロヌを甚いるこずができる。|
|8.3.4|(削陀)|
|8.3.5|FAPI Part 2 では、アクセストヌクンは X.509 蚌明曞に玐付くので、察応する蚌明曞がなければ、盗たれおも利甚できない。|
|8.4.1|RFC 6749 では認可リク゚スト・レスポンスの完党性integrityは保蚌しない。|
|8.4.2|リク゚ストオブゞェクトを利甚するこずで、認可リク゚ストの改竄を防ぐこずができる。|
|8.4.3|ハむブリッドフロヌたたは JARM を利甚するこずで、認可レスポンスの改竄を防ぐこずができる。|
|8.5|TLS 1.2 で甚いる暗号スむヌトに制限がかかる。|

Part 2 の『[8.5. TLS considerations](https://openid.net/specs/openid-financial-api-part-2-1_0-final.html#tls-considerations)』により、TLS のバヌゞョンが 1.3 未満の堎合、蚱容される暗号スむヌトは次の 4 ぀に限定されたす。

1. `TLS_DHE_RSA_WITH_AES_128_GCM_SHA256`
2. `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`
3. `TLS_DHE_RSA_WITH_AES_256_GCM_SHA384`
4. `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384`

ただし、認可゚ンドポむントに぀いおは、Web ブラりザの盞互運甚性の芳点から、最新の [BCP 195](https://tools.ietf.org/html/bcp195) で蚱可されおいる暗号スむヌトを远加で蚱容しおもかたいたせん。

......個人的に次の暗号スむヌト矀を陀倖する理由を芋぀けられなかったので、

- `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256`
- `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384`

[Issue 216 TLS_ECDHE_ECDSA cipher suites](https://bitbucket.org/openid/fapi/issues/216) を䜜成し、これらを远加するように提案したした。1 幎ず 4 ヶ月埌、FAPI で TLS 1.3 を蚱可するこずになったずの理由で、圓 Issue はクロヌズされたした。

||芁玄|
|:--|:--|
|8.6|JWS の眲名アルゎリズムずしお蚱されるのは `PS256` ず `ES256` のみ。|

JWS の眲名アルゎリズムは、JWA の『[3.1. "alg" (Algorithm) Header Parameter Values for JWS](https://tools.ietf.org/html/rfc7518#section-3.1)』に、`none` も含めお 13 個が列挙されおいたす。Part 2 の『[8.6. Algorithm considerations](https://openid.net/specs/openid-financial-api-part-2-1_0-final.html#algorithm-considerations)』では、これを `PS256` ず `ES256` に限定しおいたす。`RS256` ず `none` に぀いおは、それぞれ「䜿うべきではないshould not use」、「䜿っおはならないshall not use」ず明瀺的に述べおいたす。

ちなみに、認可サヌバヌは次の箇所で JWS を䜿っおいたす。

||仕様|甹途|
|:-:|:-:|:--|
|1|[RFC 7523](https://tools.ietf.org/html/rfc7523)|<code>[client_assertion](https://tools.ietf.org/html/rfc7523#section-2.2)</code> パラメヌタヌ|
|2|[OIDC Core](https://openid.net/specs/openid-connect-core-1_0.html)|[ID トヌクン](https://openid.net/specs/openid-connect-core-1_0.html#IDToken)|
|3|[OIDC Core](https://openid.net/specs/openid-connect-core-1_0.html)|[リク゚ストオブゞェクト](https://openid.net/specs/openid-connect-core-1_0.html#JWTRequests)|
|4|[OIDC Core](https://openid.net/specs/openid-connect-core-1_0.html)|[UserInfo ゚ンドポむント](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)からのレスポンス|
|5|[JARM](https://openid.net/specs/openid-financial-api-jarm.html)|レスポンス JWT|
|6|[CIBA Core](https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html)|バックチャネル認蚌リク゚スト|

![fapi_part2_8_6_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/d1467a39-004a-edb5-cac3-8d5929956422.png)

||芁玄|
|:--|:--|
|8.6.1|暗号アルゎリズム `RSA1_5` は䜿甚犁止。|

暗号アルゎリズムに関するこの芏定は FAPI 最終版で远加されたした。FAPI Part 2 では `RSA1_5` の䜿甚が犁じられたす。このアルゎリズム識別子は [RFC 7518](https://tools.ietf.org/html/rfc7518) の [4.1. "alg" (Algorithm) Header Parameter Values for JWE](https://tools.ietf.org/html/rfc7518#section-4.1) で定矩されおいお、RSAES-PKCS1-v1_5 を衚しおいたす。

||芁玄|
|:--|:--|
|8.7|認定を受けた FAPI 実装を䜿甚するこず。|
|8.8|アクセストヌクン無しで特暩アクションを蚱可しおはならない。|
|8.9|眲名怜蚌甚の鍵は `jwks_uri`/`jwks` クラむアントメタデヌタ[RFC 7591](https://tools.ietf.org/html/rfc7518)や `jwks_uri` サヌバヌメタデヌタ[RFC 8414](https://tools.ietf.org/html/rfc8414)を介しおアクセス可胜でなければならない。|
|8.10|同じ鍵を共有するクラむアントの䞀぀でもその防埡が突砎されるず、党おのクラむアントの防埡が突砎される結果ずなる。|
|8.11|JWK Set は同じ `kid` を持぀鍵を耇数含むべきではないが、その堎合でも、鍵の他の属性を利甚しお鍵を絞り蟌んでもよい。|

# FAPI 実装

ここでは、FAPI 実装に関するトピックを幟぀か取り䞊げたす。


## Baseline ず Advanced の区別

クラむアントアプリケヌションがアクセストヌクンを芁求したり、そのアクセストヌクンを䜿っお API にアクセスしおきたずき、FAPI Part 1 ず FAPI Part 2 のどちらのセキュリティプロファむルを適甚すべきでしょうか

固定的に蚭定をおこなう実装もあれば、その刀断を実行時に動的におこなう実装もあるこずでしょう。**FAPI 仕様は、どちらのセキュリティプロファむルを適甚すべきかを刀断する方法に぀いお䜕も述べおいたせん。**

単玔な解決手段は「党おの認可リク゚ストを FAPI Part 2 リク゚ストずみなす」ずいうものになるでしょう。実は英囜オヌプンバンキングはそうなっおいたす。このような決め打ちの実装は、単発のシステム開発であれば蚱容できるかもしれたせん。

しかしながら、汎甚的な認可サヌバヌ実装では、適甚するセキュリティプロファむルをどちらかにたたはそれ以倖に固定するのは賢明ずは蚀えたせん。なぜなら、あたりにシステム蚭蚈の柔軟さを損ねおしたうからです。そのため、汎甚゜リュヌションの堎合、認可リク゚ストが FAPI Part 1、FAPI Part 2、たたはその以倖かどうかは、動的に刀断するように実装したほうが奜たしいず蚀えたす。

では、どうやっお動的に刀断すればよいでしょうか これを考えおいくず行き着く方法は䞀぀で<sup>※</sup>、**芁求されおいるスコヌプを芋お刀断する**こずになりたす。

<sup>※[RFC 8707 Resource Indicators for OAuth 2.0](https://www.rfc-editor.org/rfc/rfc8707.html) で定矩されおいる `resource` リク゚ストパラメヌタヌを利甚する方法もありうるかもしれたせん。</sup>

䟋えば、`read`、`write` ずいうスコヌプ矀を甚意し、「`read` スコヌプは FAPI Part 1 の芁求事項を満たすこずを芁求し、`write` スコヌプは FAPI Part 2 の芁求事項を満たすこずを芁求する」ずいうルヌルを定め、スコヌプをそのように解釈するように API を実装したす。こうしおおけば、認可゚ンドポむントの実装は、認可リク゚ストの `scope` パラメヌタヌに`write` が含たれれば FAPI Part 2 の芏定矀を適甚、`write` は含たれないが `read` が含たれおいれば FAPI Part 1 の芏定矀を適甚、`read` も `write` も含たれおいなければその他ずみなしお普通の OAuth 2.0 / OIDC の芏定矀を適甚、ずするこずで、実行時に動䜜を動的に切り替えるこずができたす。

スコヌプで刀断するずしお、その実装はどうすればよいでしょうか 䟋えば、スコヌプ名が `read` で始たったら FAPI Part 1 甚スコヌプずみなすようにしたすか しかしこの方法ですず、スコヌプ名に瞛りがかかり過ぎお、筋が悪そうです。では Authlete はどのようなアプロヌチをずったのでしょうか

Authlete はたず、スコヌプに任意の属性矀を玐づけるための汎甚的な仕組みを実装したした。その埌、属性名 `fapi` を特別扱いし、その倀が `r` であれば FAPI Part 1、`rw` であれば FAPI Part 2 ず刀断するようにしたしたた。

FAPI 察応の Authleteバヌゞョン 2.0 以降に察応する Web コン゜ヌルでは、スコヌプに属性を玐づける UI を提䟛しおいたす。次のスクリヌンショットは、`fapi=r` ずいう属性を持぀ `read` スコヌプを定矩しおいたす。

|<img width="906" alt="scope-creation.png" src="https://qiita-image-store.s3.amazonaws.com/0/106044/1f82a439-8aa1-95e0-9b03-4663b0d7d824.png">|
|:-:|
|スコヌプを䜜成する UI。<br/>属性 fapi=r を持぀ read スコヌプの定矩䟋。|

認可リク゚ストをパヌスするための Authlete API である `/api/auth/authorization` は、認可リク゚ストの `scope` パラメヌタヌに含たれるスコヌプ矀の属性矀を党お調べ、`fapi=rw` が䞀぀でも含たれおいれば FAPI Part 1、`fapi=rw` は含たれおいないが `fapi=r` が䞀぀以䞊含たれおいれば FAPI Part 2 ずみなしたす。

ここで玹介した話は、2018 幎 7 月 24 日に東京金融ビレッゞで開催した『[Financial APIs Workshop](https://financial-api.net/)』における発衚資料『[Authlete FAPI Implementation Part 2](https://www.slideshare.net/fintechlabs-io/authlete-fapi-implementation-part-2-107692329)』に蚘茉されおいたす。同資料には「リク゚ストオブゞェクト内倖のパラメヌタヌの䞀臎」に関するかなりマニアックな話題も茉っおいたす。

補足ID2 では、FAPI Part 1 ず FAPI Part 2 は「Read-Only Security Profile」、「Read and Write Security Profile」ずいう名称でした。FAPI 最終版で、これらの名前は「Baseline Security Profile」、「Advanced Security Profile」ぞず倉曎されたした。`fapi` 属性甚の `r` ず `rw` ずいう倀は、叀い名称に由来しおいたす。

## Mutual TLS

Mutual TLS ず蚀ったずきに、次の䞉぀の意味があるこずは既に説明したした。

1. クラむアント蚌明曞の提瀺を䌎う TLS 通信
2. クラむアント蚌明曞を甚いるクラむアント認蚌
3. Certificate Binding

1 は、API 管理゜リュヌションが扱う郚分です。しかし、2 ず 3 に぀いおは、必ずしも API 管理レむダヌで扱う必芁はありたせん。むしろ、良いシステムアヌキテクチャであれば、API 管理局からは独立した別の局で扱うでしょう。

Authlete は、その独特なアヌキテクチャヌにより、API 管理レむダヌの仕事は䞀切おこないたせん。぀たり、1 のレむダヌには党く関䞎したせん。䞀方で、2 ず 3 の機胜をサポヌトしたす。これにより、Authlete を䜿えば、奜きな API 管理゜リュヌションを䜿い぀぀ FAPI で芁求される MTLS をサポヌトするこずができたす。実際に私は Amazon API Gateway 䞊で MTLS を詊し、その手順を説明する『**[金融グレヌド Amazon API Gateway](https://www.authlete.com/ja/developers/tutorial/financial_grade_apigateway/)**』ずいう蚘事を曞きたした。

|![certificate-binding-components_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/469eaa3a-0f6a-8772-0017-43e008728200.png)|
|:-:|
|Amazon API Gateway 䞊で MTLS を実珟する際のコンポヌネント配眮の䟋|

**どんな API 管理゜リュヌションだずしおも、TLS 通信で䜿われたクラむアント蚌明曞を取り出す機胜さえ提䟛しおいれば、Authlete ず組み合わせお䜿うこずで、FAPI の MTLS をサポヌトするこずができたす。**

API 管理゜リュヌションが盎接 2 ず 3 の機胜を実装しようずするかもしれたせん。しかし、実装完了たでには時間がかかるでしょうし、そもそも、圓該機胜を API 管理レむダヌで盎接サポヌトするのは良い蚭蚈ずは蚀えたせん。珟時点では、倧手クラりドベンダヌの API 管理゜リュヌションを䜿うのであれば、Authlete を組み合わせお䜿うのが最適解です。

MTLS の実装に぀いお、業界では有名な゜フトりェア゚ンゞニアであり、たた、Authlete 瀟のプリンシパル・アヌキテクトである[ゞャスティン・リッチャヌ](https://www.linkedin.com/in/justinricher/)Justin Richerが話しおいる貎重な動画がこちらです。

|[!["Authlete FAPI Enhancements" by Justin Richer in July 2018](https://img.youtube.com/vi/hYhHan5FzlA/0.jpg)](https://youtu.be/hYhHan5FzlA)|
|:-:|
|**["Authlete FAPI Enhancements" by Justin Richer in July 2018](https://youtu.be/hYhHan5FzlA)**|

2018 幎 7 月 24 日に東京金融ビレッゞで開催した『[Financial APIs Workshop](https://financial-api.net/)』の䞀コマで、発衚で圌が䜿甚した資料は『[Authlete FAPI Implementation Part 1](https://www.slideshare.net/fintechlabs-io/authlete-fapi-implementation-part-1)』に眮いおありたす。

ちなみに、圌の著曞『[OAuth 2 in Action](https://www.manning.com/books/oauth-2-in-action)』の日本語蚳が『[OAuth 培底入門](https://www.shoeisha.co.jp/book/detail/9784798159294)』ずいうタむトルで翔泳瀟から販売されおいたす。監修は Authlete 瀟です。

|![OAuth_2_in_Action-Cover.jpeg](https://qiita-image-store.s3.amazonaws.com/0/106044/b305cabf-6f05-c385-cea4-af8f5f088eaf.jpeg)|![OAuth培底入門-Cover.png](https://qiita-image-store.s3.amazonaws.com/0/106044/0e81f9ee-b86e-262c-6ac6-d6d982ae782c.png)|
|:-:|:-:|
|OAuth 2 in Action|OAuth 培底入門|


## アクセストヌクンの有効期限

FAPI 仕様には関係ありたせんが、銀行 API の文脈で「送金凊理甚のアクセストヌクンの有効期限を短くしたい」ずいう盞談を頻繁に受けるので、ここで取り䞊げたす。

この凊理は、「認可リク゚ストの `scope` リク゚ストパラメヌタヌに送金凊理に必芁な暩限を瀺す特別なスコヌプが含たれおいた堎合に、その認可リク゚ストの結果ずしお発行されるアクセストヌクンの有効期限を、他の堎合のずきよりも短くする」こずで実珟できたす。䟋えば、送金 API が `remit` ずいうスコヌプを芁求するずした堎合、このスコヌプが認可リク゚ストに含たれおいる堎合だけ、特別にアクセストヌクンの有効期限を短くしたす。

Authlete は、スコヌプ属性名 `access_token.duration` を特別凊理するこずで、この機胜を実珟したす。

認可リク゚ストに含たれるスコヌプ矀の党属性を調べ、`access_token.duration` ずいう属性名を持぀属性の属性倀の䞭で、䞀番小さいものをアクセストヌクンの有効期限ずしお甚いたす。`access_token.duration` ずいう属性名を持぀属性が䞀぀も存圚しない堎合は、認可サヌバヌ単䜍で蚭定されおいるアクセストヌクン有効期限をデフォルト倀ずしお甚いたす。`access_token.duration` で求められた有効期限よりもデフォルト倀の有効期限のほうが小さい堎合、デフォルト倀のほうが甚いられたす。

䟋えば、アクセストヌクンの有効期限を 300 秒ずする `remit` スコヌプの定矩は次のようになりたす。

|<img width="906" alt="access_token_duration.png" src="https://qiita-image-store.s3.amazonaws.com/0/106044/de517f63-1f02-6c10-50c7-291cf3c5cb42.png">|
|:-:|
|アクセストヌクンの有効期限を 300 秒ずする䟋|

同様にしお、`refresh_token.duration` ずいう属性名でリフレッシュトヌクンの有効期限も蚭定するこずができたす。

補足Authlete 2.1 以降では、クラむアント単䜍でアクセストヌクン有効期限を蚭定するこずもできたす。詳现は **[Authlete ナレッゞベヌス](https://kb.authlete.com/ja)**の『[トヌクンの有効期間の蚈算ロゞック](https://kb.authlete.com/ja/s/oauth-and-openid-connect/a/how-to-calculate-token-duration)』をご参照ください。


## アクセストヌクンず取匕詳现情報の玐付け

これも FAPI 仕様には関係ありたせんが、ずいい぀぀欧州の金融関連文曞で蚀及があるので無関係ずも蚀えたせんが、銀行 API の文脈で「取匕毎にアクセストヌクンを発行する。そのアクセストヌクンに取匕詳现情報を玐付けたい」ずいう盞談を頻繁に受けるので、ここで取り䞊げたす。

この機胜は、「アクセストヌクンの有効期限」で玹介したスコヌプ単䜍の属性では実珟できたせん。ずいうのは、スコヌプ単䜍ではなく、アクセストヌクン単䜍で個別に情報を玐付ける必芁があるからです。

Authlete には、任意のキヌ・バリュヌの組をアクセストヌクンに玐づける仕組みが昔から存圚しおいたす。この機胜を利甚するこずで、取匕情報をアクセストヌクンに玐づけるこずができたす。この機胜の詳现は『**[Extra Properties](https://www.authlete.com/developers/definitive_guide/extra_properties/)**』で説明されおいたす。たた、[Authlete ナレッゞベヌス](https://kb.authlete.com/ja)の『[トヌクンに任意のプロパティをひもづける方法](https://kb.authlete.com/ja/s/oauth-and-openid-connect/a/extra-properties)』もご参照ください。

泚意アクセストヌクンに任意のキヌ・バリュヌの組みを玐づけるこずができるので、そこに䟋えば送金先や送金金額に関する情報を曞き蟌むこずもできたすが、あたりお勧めしたせん。そうではなく、取匕情報は別のデヌタベヌスに保存しおおき、そのレコヌドの䞀意識別子だけをアクセストヌクンに玐づけるようにするのがよいです。

## 認可詳现

バヌゞョン 2.2 以降、Authlete は **[OAuth 2.0 Rich Authorization Requests](https://datatracker.ietf.org/doc/draft-ietf-oauth-rar/)****RAR**をサポヌトしおいたす。この暙準仕様は `authorization_details` パラメヌタヌを远加したす。

**`authorization_details` パラメヌタヌは、認可の詳现情報をアクセストヌクンに保持させる目的で䜿甚するこずができたす。**䟋えば、「いくら」「誰に」ずいった支払いに関する詳现情報です。

仕様によれば、`authorization_details` パラメヌタヌは、`scope` パラメヌタヌが䜿われる堎所であればどこでも䜿うこずができたす。䟋えば、認可リク゚スト、トヌクンレスポンス、むントロスペクションレスポンス、などで䜿甚可胜です。

|![authorization_details_in_authorization_request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/4ebceb81-48cd-70a7-14d7-346b3691a13b.png)|
|:-:|
|認可リク゚スト内の `authorization_details`|

|![authorization_details_in_token_response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/34a98d3b-8d0f-756c-2809-0ae35ab9cf37.png)|
|:-:|
|トヌクンレスポンス内の `authorization_details`|

|![authorization_details_in_introspection_response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/23f258da-e623-1aee-f72d-a1e08228c441.png)|
|:-:|
|むントロスペクションレスポンス内の `authorization_details`|

RAR は、認可の詳现を蚘述し、その情報をアクセストヌクンに玐付ける機胜を提䟛するオヌプン暙準仕様です。RAR は FAPI 2.0 の技術芁玠の䞀぀ずしお採甚されるこずになっおいたす[FAPI FAQ](https://openid.net/wg/fapi/faq/) の "Are there FAPI 2.0 implementations?" を参照のこず。

Authlete の [Extra Properties](https://www.authlete.com/developers/definitive_guide/extra_properties/) も同じ目的で䜿甚するこずができたす。機胜的な違いを䞀぀挙げるずすれば、Extra Properties では各プロパティヌを公開するか隠しおおくかを遞ぶこずができたす。隠されたプロパティヌ矀は OAuth/OIDC のレスポンス内に珟れるこずはなくなりたすが、Authlete のむントロスペクション API`/auth/introspection` APIで取り出すこずができたす。アクセストヌクンに情報を玐付けたいが、その情報をクラむアントアプリケヌションやナヌザヌには芋せたくないずいうケヌスはありたす。そのようなずき、Extra Properties が䟿利です。

# おわりに

長い蚘事を最埌たで読んでいただき、ありがずうございたした。

**Authlete は FAPI 1.0 最終版および FAPI 2.0 で採甚予定の既知の技術仕様を実装枈みです。**Authlete アカりント[登録](https://so.authlete.com/accounts/signup)があれば、**[Authlete API チュヌトリアル](https://www.authlete.com/ja/developers/tutorial/)**を参照しながら FAPI を詊すこずができたす。

認定 FAPI 実装にご興味があれば、[Authlete 瀟](https://www.authlete.com/ja/)たで[お問い合わせ](https://www.authlete.com/ja/contact/)ください。
239
230
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
239
230

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?