| RFC 9396 | OAuth-RAR | 2023年5月 |
| Lodderstedt ほか | 標準化過程 | [ページ] |
この文書は、新しいパラメーターauthorization_detailsを規定します。これは、
OAuthメッセージで細粒度の認可データを伝達するために使用されます。¶
これはインターネット標準化過程の文書です。¶
この文書は、Internet Engineering Task Force (IETF)の成果物です。これはIETFコミュニティの合意を表しています。これは 公開レビューを受けており、 Internet Engineering Steering Group (IESG)によって公開が承認されています。インターネット標準に関する さらなる情報は、RFC 7841のセクション2で入手できます。¶
この文書の現在の状態、正誤表、 およびこれに関するフィードバックの提供方法についての情報は、 https://www.rfc-editor.org/info/rfc9396で入手できます。¶
Copyright (c) 2023 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
"The OAuth 2.0 Authorization Framework" [RFC6749]は、OAuth
クライアントがアクセストークンの要求スコープ、すなわち限定された権限を
指定できるscopeパラメーターを定義しています。
この仕組みは、「リソース所有者のプロファイルへの読み取りアクセスを与えてください」
のような静的なシナリオおよび粗い粒度の認可リクエストを実装するには十分です。しかし、
「Merchant Aに45ユーロを送金させてください」
または「ディレクトリAへの読み取りアクセスとファイルXへの書き込みアクセスを与えてください」
のような細かい粒度の認可要件を指定するには十分ではありません。¶
この仕様は、JSON
[RFC8259]データ構造の表現力を使用して、
クライアントが細かい粒度の認可要件を指定できる新しいパラメーター
authorization_detailsを導入します。¶
たとえば、信用振替(複数のオープンバンキングの取り組みでは 「payment initiation」と呼ばれる)の認可リクエストは、次のようなJSONオブジェクトで表現できます。¶
{
"type": "payment_initiation",
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"bic":"ABCIDEFFXXX",
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
このオブジェクトには、金額、通貨、債権者など、 ユーザーに通知し同意を得るために必要な、意図された支払いに関する詳細情報が含まれます。 認可サーバー(AS)とそれぞれのリソースサーバー(RS)(支払い開始APIを提供)は、 この同意を共同で強制します。¶
オープンバンキングおよび電子署名分野における新しいユースケースから生じる課題の包括的な議論については、 [Transaction-Auth]を参照してください。¶
この仕様は、カスタム認可リクエストを容易にすることに加えて、 異なるAPI間で使用するための共通データ型フィールドのセットも導入します。¶
この文書におけるキーワード"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、 "MAY"、および"OPTIONAL"は、 ここで示されるようにすべて大文字で現れる場合に限り、BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。¶
この仕様では、"The OAuth 2.0 Authorization Framework" [RFC6749]で定義される "access token"、"refresh token"、"authorization server"(AS)、"resource server"(RS)、 "authorization endpoint"、"authorization request"、"authorization response"、"token endpoint"、 "grant type"、"access token request"、"access token response"、および "client"という用語を使用します。¶
リクエストパラメーターauthorization_detailsは、JSON表記で、
オブジェクトの配列を含みます。各JSONオブジェクトには、
特定の種類のリソースに関する認可要件を指定するためのデータが含まれます。
リソースまたはアクセス要件の種類は
typeフィールドによって決定されます。このフィールドは次のように定義されます。¶
type:
typeフィールドの値は、それを含むオブジェクトで許可される内容を決定します。
値は、ASのコンテキストにおいて、記述されたAPIに対して一意です。このフィールドは
REQUIREDです。¶
authorization_details配列は、同じtypeの複数のエントリーを
含むことがMAYです。¶
図 2は、上に示した例データを使用した
payment_initiation型のauthorization_detailsを示しています。¶
[
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
図 3は、 アカウント情報へのアクセスと支払いを開始する許可を求める組み合わせリクエストを示しています。¶
[
{
"type": "account_information",
"actions": [
"list_accounts",
"read_balances",
"read_transactions"
],
"locations": [
"https://example.com/accounts"
]
},
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
account_informationおよび
payment_initiationのtypeフィールドを持つJSONオブジェクトは、
同意を求めるためにASによって使用される異なるauthorization_detailsを表します。¶
この仕様は、異なる種類のAPI全体で使用できるように設計された 共通データフィールドのセットを定義します。この仕様は、API定義にこれらの共通フィールドの使用を要求せず、 代わりに、API設計者が利用できる再利用可能な汎用コンポーネントとして提供します。 すべてのフィールドの許可される値は、特定の"type"値によって定義される、保護対象のAPIによって決定されます。¶
locations:
actions:
datatypes:
identifier:
privileges:
異なる共通データフィールドを組み合わせて使用する場合、
クライアントが要求する権限はすべての値の積になります。
このオブジェクトは、オブジェクト内に列挙されたすべてのactions値が、
オブジェクト内に列挙されたすべてのlocations値において、オブジェクト内に列挙されたすべての
datatypes
値に対して使用されることのリクエストを表します。次の例では、クライアントは
customer_information API内の顧客に属するcontactsとphotosの両方に対する
readおよびwrite
アクセスを要求しています。
このリクエストが許可された場合、クライアントは、
写真への読み取りアクセスと連絡先への書き込みアクセスなど、
APIによって定義される権利の任意の組み合わせを使用できると想定するでしょう。¶
[
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"read",
"write"
],
"datatypes": [
"contacts",
"photos"
]
}
]
クライアントがアクセスをより細かく制御したい場合は、
複数のオブジェクトを送信できます。この例では、
クライアントは、同じAPIエンドポイント内のcontactsへのreadアクセスと、
photosへのwriteアクセスを要求しています。
このリクエストが許可された場合、クライアントは連絡先に書き込むことはできません。¶
[
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"read"
],
"datatypes": [
"contacts"
]
},
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"write"
],
"datatypes": [
"photos"
]
}
]
APIは、それぞれの認可オブジェクトのtypeに従って、
独自の拡張を定義することがMAYです。
API設計者は、この仕様で定義された共通データフィールドと、
API自体に固有のフィールドを組み合わせて使用することが想定されます。
次の非規範的な例は、2つの異なる架空のAPI type値の一部として、
共通フィールドとAPI固有フィールドの両方を使用する方法を示しています。最初の
アクセスリクエストには、ここで指定されたactions、locations、および
datatypes
フィールドに加え、指定された座標で撮影された写真へのアクセスを示すAPI固有の
geolocation
フィールドが含まれています。2番目のアクセスリクエストには、ここで指定された
actionsおよび
identifierフィールドに加え、API固有の
currencyフィールドが含まれています。¶
[
{
"type":"photo-api",
"actions":[
"read",
"write"
],
"locations":[
"https://server.example.net/",
"https://resource.local/other"
],
"datatypes":[
"metadata",
"images"
],
"geolocation":[
{
"lat":-32.364,
"lng":153.207
},
{
"lat":-35.364,
"lng":158.207
}
]
},
{
"type":"financial-transaction",
"actions":[
"withdraw"
],
"identifier":"account-14-32-32-3",
"currency":"USD"
}
]
このリクエストが承認された場合、結果として得られるアクセストークンのアクセス権は、 上記と同様に、2つのAPIそれぞれについて要求されたアクセス種類の和集合になります。¶
authorization_details認可リクエストパラメーターは、
scopeパラメーターが同じ目的で使用されるすべての場所で、
認可要件を指定するために使用できます。例には次が含まれます。¶
[RFC6749]で定義される認可リクエストの場合、実装者は、 フローのセキュリティ、プライバシー、および信頼性を向上させるために、 pushed authorization requests [RFC9126]の使用を 検討することがMAYです。詳細については、セクション12、13、および11.4 を参照してください。¶
パラメーターのエンコーディングは、それぞれのコンテキストによって決定されます。
[RFC6749]に従った認可リクエストのコンテキストでは、
パラメーターは、セクション2の例を使用して、
図 8に示されるように、シリアライズされたJSONの
application/x-www-form-urlencoded形式を使用してエンコードされます(改行は表示目的のみ)。¶
authorization_detailsパラメーターで提供されたデータに基づき、ASは
ユーザーに対して、要求されたアクセス権限への同意を求めます。¶
図 9では、クライアントは アカウント情報へのアクセスと支払いの開始を取得したいと考えています。¶
[
{
"type": "account_information",
"actions": [
"list_accounts",
"read_balances",
"read_transactions"
],
"locations": [
"https://example.com/accounts"
]
},
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
authorization_detailsとscopeは、
独立した認可要件を運ぶために、同じ認可リクエストで使用できます。¶
authorization_detailsとscopeの併用は、
既存のOAuthベースのアプリケーションが段階的にauthorization_detailsのみの使用へ
移行できるようにするため、この仕様で部分的にサポートされています。
特定のAPIは、要件指定の形式を1つだけ使用することがRECOMMENDEDです。¶
ASは、与えられた認可リクエストについて、両方の要件セットを相互に組み合わせて処理 MUSTします。ASがこれらのパラメーターをどのように組み合わせるかの詳細は、 保護対象のAPIに固有であり、この仕様の範囲外です。¶
ユーザー同意を取得するとき、ASは認可リクエストによって表される統合された要件セットを提示 MUSTします。¶
リソース所有者がクライアントに要求されたアクセスを許可した場合、ASは
それぞれのauthorization_details(および該当する場合はscope値)に関連付けられた
トークンをクライアントに発行します。¶
[RFC8707]で定義される
resource認可リクエストパラメーターは、要求されたスコープを適用できるリソースを
さらに決定するために使用できます。resource
パラメーターは、ASがauthorization_details認可リクエストパラメーターを処理する方法には
影響しません。¶
ASは、未知の認可詳細タイプまたはそれぞれのタイプ定義に適合しない認可詳細の処理を拒否
MUSTします。ASは、authorization_details構造内のオブジェクトについて
次のいずれかが真である場合、処理を中止し、エラー
invalid_authorization_detailsでクライアントに応答
MUSTします。¶
authorization_detailsトークンリクエストパラメーターは、
ASがアクセストークンに割り当てることをクライアントが望む認可詳細を指定するために使用できます。
ASは、基礎となるグラント(authorization_code、
refresh_tokenなどのグラントタイプの場合)またはクライアントのポリシー(
client_credentialsグラントタイプの場合)が、要求された認可詳細を持つアクセストークンの発行を
許可するかどうかを確認します。そうでない場合、ASはエラーコード
invalid_authorization_details(invalid_scopeと同様)でリクエストを拒否します。¶
[RFC6749]で定義されるトークンレスポンスパラメーターに加えて、ASは
リソース所有者によって付与され、それぞれのアクセストークンに割り当てられた
authorization_detailsも返す
MUSTです。¶
トークンレスポンスで発行されたアクセストークンに割り当てられる認可詳細は、
対応するトークンリクエストのauthorization_detailsパラメーターによって決定されます。
クライアントがauthorization_detailsトークンリクエストパラメーターを指定しない場合、ASは
結果となるauthorization_detailsを自身の裁量で決定します。¶
ASは、クライアントへの
authorization_details内の値を省略することが
MAYです。¶
継続例では、次のようになります。¶
RSが認可プロセスで承認された認可詳細を強制できるようにするため、
ASはこのデータをRSで利用可能にする
MUSTです。ASは、JSON Web Token(JWT)形式のアクセストークンまたは
トークンイントロスペクションレスポンスにauthorization_detailsフィールドを追加することが
MAYです。¶
アクセストークンがJWT [RFC7519]である場合、ASは、 特定のオーディエンス向けにフィルタリングされた認可詳細オブジェクトをトップレベルのクレームとして追加することが RECOMMENDEDです。¶
ASは通常、RSがリクエスト処理に必要とする追加のクレーム、 たとえばユーザーID、ロール、取引固有のデータもJWTに追加します。 特定のRSが必要とするクレームは、ASとのRS固有ポリシーによって定義されます。¶
次は、上記の支払い開始例に関するJWT例の内容を示します。¶
{
"iss": "https://as.example.com",
"sub": "24400320",
"aud": "a7AfcPcsl2",
"exp": 1311281970,
"acr": "psd2_sca",
"txn": "8b4729cc-32e4-4370-8cf0-5796154d1296",
"authorization_details": [
{
"type": "https://scheme.example.com/payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
],
"debtorAccount": {
"iban": "DE40100100103307118608",
"user_role": "owner"
}
}
この場合、ASはJWTベースのアクセストークンに次の例のクレームを追加しました。¶
トークンイントロスペクション [RFC7662]は、RSがASに問い合わせて
アクセストークンに関する情報を判断する手段を提供します。ASがレスポンスにトークンの認可詳細情報を含める場合、
その情報はイントロスペクションレスポンスJSONオブジェクトのトップレベルメンバーとして
authorization_detailsで伝達される
MUSTです。authorization_detailsメンバーは、
セクション2で定義された同じ構造を含む
MUSTであり、イントロスペクションリクエストを行うRS向けに
フィルタリングおよび拡張される可能性があります。¶
支払い開始例のイントロスペクションレスポンス例を次に示します。¶
{
"active": true,
"sub": "24400320",
"aud": "s6BhdRkqt3",
"exp": 1311281970,
"acr": "psd2_sca",
"txn": "8b4729cc-32e4-4370-8cf0-5796154d1296",
"authorization_details": [
{
"type": "https://scheme.example.com/payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant123",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
],
"debtorAccount": {
"iban": "DE40100100103307118608",
"user_role": "owner"
}
}
この機能のサポートを広告するために、サポートされている認可詳細タイプの一覧は、
メタデータパラメーターauthorization_details_types_supportedを使用して
ASメタデータレスポンス [RFC8414]に含められます。これはJSON配列です。¶
これは次の例で示されます。¶
{
...
"authorization_details_types_supported":[
"payment_initiation",
"account_information"
]
}
クライアントは、クライアント登録メタデータパラメーター
authorization_details_typesを使用して、認可を要求するときに使用する認可詳細タイプを
示すことがMAYです。これはJSON配列です。¶
これは次の例で示されます。¶
{
...
"authorization_details_types":[
"payment_initiation"
]
}
ASへの認可詳細タイプの登録は、この仕様の範囲外です。¶
この仕様をサポートする一般的なAS実装は、 次の基本機能を提供すべきです。¶
authorization_detailsパラメーターを受け入れることをサポートする¶
authorization_codeおよびrefresh_tokenで機能すべきです。¶
認可詳細の処理および提示は、異なる認可詳細タイプ間で大きく異なります。 したがって、実装はそれぞれの動作のカスタマイズをサポートすべきです。特に、実装は デプロイメントが次を行えるようにすべきです。¶
このようなカスタマイズをサポートする1つのアプローチは、 拡張モジュールの登録を可能にする仕組みを持つことです。各モジュールは、 それぞれのユーザー同意のレンダリングと、構造化アクセストークンまたはトークンイントロスペクションレスポンスを介して RSに必要なデータを提供するために必要な変換を担当します。¶
実装は、認可詳細タイプを定義するために機械可読なスキーマ言語を
デプロイメントが使用できるようにして、そのようなスキーマに対する認可詳細オブジェクトの作成および検証を
容易にする可能性があります。たとえば、認可詳細
typeがJSON Schema [JSON.Schema]を使用して定義された場合、JSON Schema識別子を
それぞれの認可詳細オブジェクト内のtype値として使用できます。¶
ただし、type値はASによって、また必要な範囲で
クライアントおよびRSによって理解される識別子であることに注意してください。
この仕様は、type値が機械可読なスキーマ形式を指すこと、またはシステム内のいずれかの当事者
(クライアント、AS、RSなど)がtypeフィールドの内容を特定の方法で参照解除または処理することを
前提としていません。¶
リクエストパラメーターまたはリクエストオブジェクト内に
authorization_detailsを含む認可リクエストURIは非常に長くなる可能性があります。
したがって、実装者は、authorization_detailsを信頼性が高く安全な方法で渡すために、
[RFC9101]で定義されるrequest_uriパラメーターを、
[RFC9126]で定義されるプッシュ型リクエストオブジェクト機構と組み合わせて使用することを
検討すべきです。以下は、HTTPSで保護された接続を介して認可リクエストデータをASに直接送信する
そのようなプッシュ型認可リクエストの例です。¶
authorization_detailsパラメーターは、OAuth認可リクエストの場合に
ユーザーエージェントを通じて送信されるため、ユーザーによる変更に対して脆弱になります。
authorization_detailsの完全性が懸念される場合、クライアントは
authorization_detailsを改ざんおよび差し替えから保護
MUSTします。これは、[RFC9101]で定義される署名付きリクエストオブジェクトを使用して
リクエストに署名すること、またはrequest_uri認可リクエストパラメーターを
[RFC9101]で定義されるとおりに使用し、
[RFC9126]と組み合わせて
リクエストオブジェクトのURIをASに渡すことで実現できます。¶
authorization_detailsパラメーター内のすべての文字列比較は、
[RFC8259]で定義されるとおりに行われます。
文字列値の等価性を評価する際に、追加の変換または正規化は行われません。¶
共通データフィールドlocationsにより、クライアントは
特定の認可を使用しようとする場所、すなわち権限をRSに明確に割り当てることを指定できます。
複数のRSが存在する状況では、これはオーディエンス制限を通じて、意図しないクライアント認可
(例: メールおよびクラウドサービスの両方に適用され得るread scope値)を防ぎます。¶
ASは、インジェクション攻撃を防止するために、
authorization_detailsで渡されるデータを適切にサニタイズし処理
MUSTします。¶
実装者が、プライバシーを保護する方法で認可詳細を設計および使用することは特に重要です。¶
authorization_detailsに含まれる機微な個人データは、
たとえばリファラーヘッダーを通じて漏えいすることを防止しなければなりません。
実装上の選択肢には、[RFC9101]で定義される暗号化されたリクエストオブジェクト、
または[RFC9126]と
[RFC9101]で定義されるrequest_uri認可リクエストパラメーターを利用して、
クライアントとAS間のエンドツーエンド暗号化された接続で
authorization_detailsを送信することが含まれます。後者はアプリケーションレベルの暗号化を必要としませんが、
クライアントとASの間に別のメッセージ交換を必要とします。¶
リクエストデータが暗号化されていても、攻撃者は自身が制御するデバイス上の認可リクエストに 暗号化されたリクエストデータを注入し、ASのユーザー同意画面を使用して(復号された)ユーザーデータを平文で表示させることで、 ASを利用してユーザーのデータを知ることができます。実装はこの攻撃ベクトルを考慮し、 たとえばデータの一部のみを表示すること、または可能であれば想定されるユーザーコンテキストが (ユーザー認証後も)同一であるかどうかを判断することによって、適切な対策を実装する必要があります。¶
ASは、authorization_detailsをクライアントまたはRSと共有する際の
プライバシーへの影響を考慮する必要があります。ASは、ローカルポリシーによって決定される
「need to know」ベースでこのデータをそれらの当事者と共有すべきです。¶
次のパラメーターは、 [RFC6749]によって確立された "OAuth Parameters"レジストリ [IANA.OAuth.Parameters]に 登録されています。¶
次の値は、[RFC7519]によって 確立されたIANA "JSON Web Token Claims"レジストリに登録されています。¶
次の値は、[RFC7662]によって確立されたIANA "OAuth Token Introspection Response"レジストリに登録されています。¶
次の値は、[RFC7591]によって 確立された、[IANA.OAuth.Parameters]のIANA "OAuth Dynamic Client Registration Metadata"レジストリに登録されています。¶
OpenID Connect [OIDC]は、
JSONベースのclaimsリクエストパラメーターを指定しています。これは、クライアント
(OpenID Connect Relying Partyとして動作)が受け取りたいクレームを、細かい粒度かつ
プライバシーを保護する方法で指定し、それらのクレームを特定の配信機構、すなわちID Tokenまたは
userinfoレスポンスに割り当てるために使用できます。¶
scope値openidと追加パラメーターclaimsの組み合わせは、
すべての非OIDC scope値と同じ方法で、authorization_detailsと併せて使用できます。¶
あるいは、OpenID Connect用の認可詳細タイプが存在する可能性があります。 このセクションは、そのような認可詳細タイプがどのように見えるかの例を示しますが、 この認可詳細タイプを定義することは、この仕様の範囲外です。¶
これらの仮想的な例は、認可プロセスのOpenID Connect部分に固有のすべての詳細を、 認可JSONオブジェクト内にカプセル化しようとするものです。¶
トップレベルフィールドは、[OIDC]で与えられた定義に基づいています。¶
claim_sets:
profileなど、
それぞれのscope値の置き換えとなる、事前定義されたクレームセットの名前¶
max_age:
acr_values:
claims:
claims JSON構造¶
これは、いくつかのクレームセットに対する単純なリクエストです。¶
[
{
"type": "openid",
"locations": [
"https://op.example.com/userinfo"
],
"claim_sets": [
"email",
"profile"
]
}
]
[
{
"type": "openid",
"locations": [
"https://op.example.com/userinfo"
],
"max_age": 86400,
"acr_values": "urn:mace:incommon:iap:silver",
"claims": {
"userinfo": {
"given_name": {
"essential": true
},
"nickname": null,
"email": {
"essential": true
},
"email_verified": {
"essential": true
},
"picture": null,
"http://example.com/claims/groups": null
},
"id_token": {
"auth_time": {
"essential": true
}
}
}
}
]
次の例は、ETSI TS 119 432 [ETSI]と、 リモート署名作成のためのCloud Signature Consortium(CSC)API [CSC]で示されたリモート電子署名の概念に基づいています。¶
[
{
"type": "sign",
"locations": [
"https://signing.example.com/signdoc"
],
"credentialID": "60916d31-932e-4820-ba82-1fcead1c9ea3",
"documentDigests": [
{
"hash": "sTOgwOm+474gFj0q0x1iSNspKqbcse4IeiqlDg/HWuI=",
"label": "Credit Contract"
},
{
"hash": "HZQzZmMAIWekfGH0/ZKW1nsdt0xg3H6bZYztgsMTLw0=",
"label": "Contract Payment Protection Insurance"
}
],
"hashAlgorithmOID": "2.16.840.1.101.3.4.2.1"
}
]
トップレベルフィールドには次の意味があります。¶
credentialID:
documentDigests:
hashフィールド)を含む配列。
さらに、対応するlabelフィールドは、たとえばユーザー同意で使用するために、
それぞれの文書をユーザーに識別します。¶
hashAlgorithm:
ASは、この構造に列挙された文書の署名作成についてユーザーに同意を求めることが想定されます。 クライアントは、このプロセスの結果として発行されたアクセストークンを使用して、 それぞれの署名サービスの文書署名APIを呼び出し、実際に署名を作成します。このアクセストークンは、 ユーザーが同意したとおりに、クライアント、ユーザーID、およびハッシュ(および署名アルゴリズム)に バインドされます。¶
この例は、たとえば信用力を判断するために第三者が市民の 納税申告書および所得証明にアクセスできるAPIから着想を得ています。¶
[
{
"type": "tax_data",
"locations": [
"https://taxservice.govehub.no.example.com"
],
"actions":"read_tax_declaration",
"periods": ["2018"],
"duration_of_access": 30,
"tax_payer_id": "23674185438934"
}
]
トップレベルフィールドには次の意味があります。¶
これら2つの例は、ノルウェーのeHealthシステムで使用されるAPIの要件から着想を得ています。¶
このユースケースでは、理学療法士がローカルのElectronic Health Records(EHR)システムを使用して コンピューターの前に座っています。彼らは特定の患者の電子患者記録を見たいと考えており、 また、おそらく別の機関または全国的なサービスにある別のシステムから患者の診療記録エントリーを取得したいと考えています。 このデータへのアクセスはAPIによって提供されます。¶
APIでリクエストを認可するために必要な情報はEHRシステムだけが知っており、 APIに提示されなければなりません。¶
最初の例では、認可詳細オブジェクトは組織の識別子を含みます。 この場合、APIは、与えられた組織が機微なデータへのアクセスを与えるために 個人の健康情報を処理する法的根拠を持っているかどうかを知る必要があります。¶
"authorization_details": {
"type": "patient_record",
"requesting_entity": {
"type": "Practitioner",
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.4",
"value": "1234567"
}],
"practitioner_role": {
"organization": {
"identifier": {
"system": "urn:oid:2.16.578.1.12.4.1.2.101",
"type": "ENH",
"value": "[organizational number]"
}
}
}
}
}
2番目の例では、APIはリクエストを認可するためにより多くの情報を必要とします。 この場合、認可詳細オブジェクトは、保健機関およびリクエスト時点でユーザーが持つ現在の職業に関する 追加情報を含みます。この追加レベルの詳細は、認可とデータ最小化の両方に使用できます。¶
[
{
"type": "patient_record",
"location": "https://fhir.example.com/patient",
"actions": [
"read"
],
"patient_identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.1",
"value": "12345678901"
}
],
"reason_for_request": "Clinical treatment",
"requesting_entity": {
"type": "Practitioner",
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.4",
"value": "1234567"
}
],
"practitioner_role": {
"organization": {
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.2.101",
"type": "ENH",
"value": "<organizational number>"
}
],
"type": {
"coding": [
{
"system":
"http://hl7.example.org/fhir/org-type",
"code": "dept",
"display": "Hospital Department"
}
]
},
"name": "Akuttmottak"
},
"profession": {
"coding": [
{
"system": "http://snomed.example.org/sct",
"code": "36682004",
"display": "Physical therapist"
}
]
}
}
}
}
]
フィールドの説明:¶
patient_identifier:
reason_for_request:
requesting_entity:
このユースケースでは、ASは患者ではないリクエスト者を認証し、 ポリシーに基づいてアクセスを承認します。¶
この仕様の作成中に貴重なフィードバックをくださった Daniel Fett、Sebastian Ebling、Dave Tonge、Mike Jones、Nat Sakimura、およびRob Ottoに感謝します。¶
また、この仕様に貴重なフィードバックをくださった Vladimir Dzhuvinov、 Takahiko Kawasaki、Daniel Fett、 Dave Tonge、Travis Spencer、 Joergen Binningsboe、Aamund Bremer、 Steinar Noem、Francis Pouatcha、 Jacob Ideskog、Hannes Tschofenig、 およびAaron Pareckiにも感謝します。¶