「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>Financial API (FAPI)]]

* 目次 [#n2fbc1d1]
#contents

*概要 [#kb9f12f1]
-[[Financial API (FAPI)]]の「Read Only API用セキュリティ・プロファイル」

-金融データへの読み取り専用アクセスに適した[[OAuth]]プロファイル
--OpenID Connect(OIDC)を使用して顧客(ユーザ)を識別
--トークンを使用して、エンドポイントから保護データを読取
--エンドポイントは、JSONデータを提供するREST API

※ ドラフト 4 を参考にして作成。その後、ドラフト 6 を再度完読して加筆・修正。

*要約 [#l78424d4]

**フロー [#vb1aad4e]
このプロファイルを簡単に説明すると、クライアントごと、以下のようになる。

***Confidentialクライアント [#x56eb861]
-[[Authorization Code>OAuth#yfeb403d]]を使用して、
-+Tokenエンドポイントにクライアント認証が必要(以下の何れかが必要)。
--[[JWT Client Assertion>OpenID Connect#y7bdab62]](client_secret_jwt または private_key_jwt)
--[[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]]

***Publicクライアント [#k5a50e89]
[[OAuth PKCE]] を使用する。
-「ハッシュ関数」には、「S256」を使用する。
-「[[アプリケーション間通信>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E9%80%9A%E4%BF%A1]]」には「Claimed Https Scheme URI Redirection」を使用する。

**要件 [#o1be9ff7]

***通信 [#ab8c1fca]
-SSL/TLS(TLS 1.2以降)
-redirect_uri(完全一致)

***認証 [#pd66ca2f]

-ユーザ~
[[LoA 2>LoA(Level of Assurance)#bc4bdb6f]]~
--パスワードは1024以上の組み合わせがあること。
--IDは公的な証明書を確認して作成する。

-クライアント~
追加のクライアント認証の実装が必要(以下の何れかが必要)。
--[[JWT Client Assertion>OpenID Connect#y7bdab62]](client_secret_jwt または private_key_jwt)
--[[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]]

***トークン種類 [#g7ecf211]
[[Bearer Token(持参人切符)>トークン#b38de47f]]

*役割 [#fb8e0623]

**Authorization Server [#abd50397]

***認証・認可 [#q3242c75]
-[[LoA 2>LoA(Level of Assurance)#bc4bdb6f]]
-認可画面が必要(ここで scope の一覧を表示する)。

***クライアント認証 [#xebe23be]
-クライアント種別

--[[Confidentialクライアント>#j04c99d4]]~
[[Authorization Code>OAuth#yfeb403d]]で必要。

--[[Publicクライアント>#rb894987]]~
[[OAuth PKCE]] (S256)では不要。

-使用する場所
--Tokenエンドポイント(以下の何れかが必要)
---[[JWT Client Assertion>OpenID Connect#y7bdab62]](client_secret_jwt または private_key_jwt)
---[[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]]

-使用する鍵

--[[OIDCの要件に準拠>OpenID Connect#h9b10c6c]]

--クライアント認証で~
---共通鍵を使用する場合、~
client_secretを使う場合、 UTF-8 オクテットは128ビット以上が必要。
---公開鍵を使用する場合、~
RSAの場合、2048ビット以上、Elliptic Curveの場合、160ビット以上。

***redirect_uri [#c3ab8c19]
-事前登録が必要
-認可リクエストに必須
-完全一致が必要
-httpsのURIスキーマであること。

***codeとtoken [#i26d9f73]
-code~
未使用であること。~
≒一度だけ有効にする。

-token
--scopeのリストを含む
--有効時間は一度の利用に十分な、若しくは、非常に短い期間に限定
--最小128ビットの推測不可能な値(構造化アクセストークンを妨げるものではない)

***追加の機能 [#f6878ac0]
-[[Refresh token>OAuth#r3e36f53]]
-[[OAuth 2.0 Token Revocation]]

**Client [#p74a8363]
-[[Confidentialクライアント>#j04c99d4]]をサポートする。
-また、[[Publicクライアント>#rb894987]]をサポートすべき。

***Confidentialクライアント [#j04c99d4]
-[[クライアント認証>#xebe23be]]が必要。

-暗号要件
--RSA暗号を使用する場合、最小2048ビットのRSA鍵。
--Elliptic Curve暗号を使用する場合、最小160ビットの楕円曲線キー
--対称鍵暗号を使用する場合、クライアントの秘密鍵が128ビット以上

***Publicクライアント [#rb894987]
-[[クライアント認証>#xebe23be]]は不要。

-この代替として、S256の[[OAuth PKCE]]をサポート
--[[Authorization Server>#abd50397]]毎に[[redirect_uri>#c3ab8c19]]を変える。~
(対応が一致しない場合は、この認証・認可プロセスを中止する)
--必要に応じて[[OAuth PKCE]]中でIDトークンを取得する(併用可能)。
--ただし「[[アプリケーション間通信>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E9%80%9A%E4%BF%A1]]」に要件がある。
---Private-Use URI Scheme Redirectionはダメ
---Loopback Interface Redirectionもダメ
---Claimed Https Scheme URI Redirectionのみ利用可

-[[OAuth 2.0 for Native Apps]]のベストプラクティスを遵守する。

***HTTP [#pa51309c]
-([[Resource Server>#r3364a91]]に対する)リクエスト

--[[Resource Serverの要件>#r3364a91]]に合わせて実装する。

--その他、以下のオプションを追加できる。
---x-fapi-auth-dateヘッダ~
Resource Ownerが最後にログインした時刻を指定
---x-fapi-customer-ip-addressヘッダ~
Resource OwnerのIPアドレスを提供する。

**Resource Server [#p3a2a94b]
***HTTP [#r3364a91]
-リクエスト

--Dateヘッダ~
サーバ日付を送信

--HTTP GETメソッドの使用をサポート
--Client ≠ Resource Serverの場合、~
必要に応じてCORSなどをサポート

-レスポンス

--UTF-8でエンコード

--Content-Typeヘッダ~
Content-Type: application/json; charset=UTF-8

--x-fapi-interaction-idヘッダ
---issか、金融機関のルーティング番号
---Requestにある場合、Responseにも設定。
---Requestにない場合、GUIDを生成して設定。
---このid値は、ログに出力する。

***Accessトークン [#b5d0fc4a]
-認証ヘッダを使用し、QueryStringは使用しない。
-期限切れ、失効、スコープ等の検証を行う。
-[[OAuth 2.0 Token Introspection]]を併用可能。

*セキュリティに関する考慮事項 [#j2d12856]
-[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]を使用すべき場合、[[Part 2>FAPI Part 2 (Read and Write API Security Profile)]]を使用する。
--メッセージソース認証
--メッセージ整合性保護
--メッセージの封じ込め
---WWWブラウザからの漏洩
---WWWログからの漏洩

-ISO / IEC 29100のプライバシー原則に従う。

*考察 [#vebd7c4e]

**プロファイル [#v476a317]

***プロファイルの識別 [#m07867a9]
[[Dynamic Client Registration>OpenID Connect - Dynamic Client Registration]]のメタデータを使用するのでは?と。

-公式には以下の様に識別するらしい。
--AuthZ : ClientのMetadata登録で伝える、
--Client : Client自身は自身のProfileを解っている。

-テスト用には、取り敢えず、
--AuthZ : client_idを足し、fapi1、fapi2的なオレオレ的なMetadataを追加して対応する。
--Client : stateに、fapi1、fapi2的なプレフィックスを付与して対応する。

***他のプロファイルの抑止 [#cb29b358]
他のプロファイルで同じトークンが発行されるので、~
OAuth2 / OIDC標準のFlowは拒否しないといけない?

-[[OpenID Connect]]のように、~
「scope="* openid *"」などの識別方法が提要されていないため。

-プロファイルで定義された以外のトークン発行を抑止する。

--fapi1
---Confidential : code
---Public : PKCE

--fapi2
---Confidential : code
---Public : Hybrid?

*参考 [#qa75fcd5]
-Financial Services – Financial API - Part 1: Read-Only API Security Profile~
http://openid.net/specs/openid-financial-api-part-1.html

-Financial API 実装の技術課題 - Qiita > FAPI Part 1~
https://qiita.com/TakahikoKawasaki/items/48a9d22205f77db59726#fapi-part-1

**関連仕様 [#i8ef7e99]
ただし[[OAuth]]2 / [[OIDC>OpenID Connect]]を除く。

***[[FAPI Part 2 (Read and Write API Security Profile)]] [#kf1316fd]
***[[JWT bearer token authorizationグラント種別]] [#me675af2]
***[[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]] [#yc3529a9]

----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS