diff options
Diffstat (limited to 'doc/rfc/rfc9396.txt')
-rw-r--r-- | doc/rfc/rfc9396.txt | 1816 |
1 files changed, 1816 insertions, 0 deletions
diff --git a/doc/rfc/rfc9396.txt b/doc/rfc/rfc9396.txt new file mode 100644 index 0000000..e8a195d --- /dev/null +++ b/doc/rfc/rfc9396.txt @@ -0,0 +1,1816 @@ + + + + +Internet Engineering Task Force (IETF) T. Lodderstedt +Request for Comments: 9396 yes.com +Category: Standards Track J. Richer +ISSN: 2070-1721 Bespoke Engineering + B. Campbell + Ping Identity + May 2023 + + + OAuth 2.0 Rich Authorization Requests + +Abstract + + This document specifies a new parameter authorization_details that is + used to carry fine-grained authorization data in OAuth messages. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9396. + +Copyright Notice + + 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. + +Table of Contents + + 1. Introduction + 1.1. Conventions and Terminology + 2. Request Parameter "authorization_details" + 2.1. Authorization Details Types + 2.2. Common Data Fields + 3. Authorization Request + 3.1. Relationship to the "scope" Parameter + 3.2. Relationship to the "resource" Parameter + 4. Authorization Response + 5. Authorization Error Response + 6. Token Request + 6.1. Comparing Authorization Details + 7. Token Response + 7.1. Enriched Authorization Details in Token Response + 8. Token Error Response + 9. Resource Servers + 9.1. JWT-Based Access Tokens + 9.2. Token Introspection + 10. Metadata + 11. Implementation Considerations + 11.1. Using Authorization Details in a Certain Deployment + 11.2. Minimal Implementation Support + 11.3. Use of Machine-Readable Type Schemas + 11.4. Large Requests + 12. Security Considerations + 13. Privacy Considerations + 14. IANA Considerations + 14.1. OAuth Parameters Registration + 14.2. JSON Web Token Claims Registration + 14.3. OAuth Token Introspection Response Registration + 14.4. OAuth Authorization Server Metadata Registration + 14.5. OAuth Dynamic Client Registration Metadata Registration + 14.6. OAuth Extensions Error Registration + 15. References + 15.1. Normative References + 15.2. Informative References + Appendix A. Additional Examples + A.1. OpenID Connect + A.2. Remote Electronic Signing + A.3. Access to Tax Data + A.4. eHealth + Acknowledgements + Authors' Addresses + +1. Introduction + + "The OAuth 2.0 Authorization Framework" [RFC6749] defines the scope + parameter that allows OAuth clients to specify the requested scope, + i.e., the limited capability, of an access token. This mechanism is + sufficient to implement static scenarios and coarse-grained + authorization requests, such as "give me read access to the resource + owner's profile." However, it is not sufficient to specify fine- + grained authorization requirements, such as "please let me transfer + an amount of 45 Euros to Merchant A" or "please give me read access + to directory A and write access to file X." + + This specification introduces a new parameter authorization_details + that allows clients to specify their fine-grained authorization + requirements using the expressiveness of JSON [RFC8259] data + structures. + + For example, an authorization request for a credit transfer + (designated as "payment initiation" in several open banking + initiatives) can be represented using a JSON object like this: + + { + "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" + } + + Figure 1: Example of an Authorization Request for a Credit Transfer + + This object contains detailed information about the intended payment, + such as amount, currency, and creditor, that is required to inform + the user and obtain their consent. The authorization server (AS) and + the respective resource server (RS) (providing the payment initiation + API) will together enforce this consent. + + For a comprehensive discussion of the challenges arising from new use + cases in the open banking and electronic signing spaces, see + [Transaction-Auth]. + + In addition to facilitating custom authorization requests, this + specification also introduces a set of common data type fields for + use across different APIs. + +1.1. Conventions and Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + This specification uses the terms "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", and "client" defined by "The OAuth 2.0 Authorization + Framework" [RFC6749]. + +2. Request Parameter "authorization_details" + + The request parameter authorization_details contains, in JSON + notation, an array of objects. Each JSON object contains the data to + specify the authorization requirements for a certain type of + resource. The type of resource or access requirement is determined + by the type field, which is defined as follows: + + type: An identifier for the authorization details type as a string. + The value of the type field determines the allowable contents of + the object that contains it. The value is unique for the + described API in the context of the AS. This field is REQUIRED. + + An authorization_details array MAY contain multiple entries of the + same type. + + Figure 2 shows an authorization_details of type payment_initiation + using the example data shown above: + + [ + { + "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" + } + ] + + Figure 2: Example of "authorization_details" for a Credit Transfer + + Figure 3 shows a combined request asking for access to account + information and permission to initiate a payment: + + [ + { + "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" + } + ] + + Figure 3: Example of "authorization_details" for a Combined Request + + The JSON objects with type fields of account_information and + payment_initiation represent the different authorization_details to + be used by the AS to ask for consent. + + | Note: The AS will make this data subsequently available to the + | respective RSs (see Section 9). + +2.1. Authorization Details Types + + The AS controls the interpretation of the value of the type parameter + as well as the object fields that the type parameter allows. + However, the value of the type parameter is also generally documented + and intended to be used by developers. It is RECOMMENDED that API + designers choose type values that are easily copied without + ambiguity. For example, some glyphs have multiple Unicode code + points for the same visual character, and a developer could + potentially type a different character than what the AS has defined. + Possible means of reducing potential confusion are limiting the value + to ASCII [RFC0020] characters, providing a machine-readable listing + of data type values, or instructing developers to copy and paste + directly from the documentation. + + If an application or API is expected to be deployed across different + servers, such as the case in an open standard, the API designer is + RECOMMENDED to use a collision-resistant namespace under their + control, such as a URI that the API designer controls. + + The following example shows how an implementation could utilize the + namespace https://scheme.example.org/ to ensure collision-resistant + type values. + + { + "type": "https://scheme.example.org/files", + "locations": [ + "https://example.com/files" + ], + "permissions": [ + { + "path": "/myfiles/A", + "access": [ + "read" + ] + }, + { + "path": "/myfiles/A/X", + "access": [ + "read", + "write" + ] + } + ] + } + + Figure 4: Example of "authorization_details" with a URL as Type + Identifier + +2.2. Common Data Fields + + This specification defines a set of common data fields that are + designed to be usable across different types of APIs. This + specification does not require the use of these common fields by an + API definition but, instead, provides them as reusable generic + components for API designers to make use of. The allowable values of + all fields are determined by the API being protected, as defined by a + particular "type" value. + + locations: An array of strings representing the location of the + resource or RS. These strings are typically URIs identifying the + location of the RS. This field can allow a client to specify a + particular RS, as discussed in Section 12. + + actions: An array of strings representing the kinds of actions to be + taken at the resource. + + datatypes: An array of strings representing the kinds of data being + requested from the resource. + + identifier: A string identifier indicating a specific resource + available at the API. + + privileges: An array of strings representing the types or levels of + privilege being requested at the resource. + + When different common data fields are used in combination, the + permissions the client requests are the product of all the values. + The object represents a request for all actions values listed within + the object to be used at all locations values listed within the + object for all datatypes values listed within the object. In the + following example, the client is requesting read and write access to + both the contacts and photos belonging to customers in a + customer_information API. If this request is granted, the client + would assume it would be able to use any combination of rights + defined by the API, such as read access to the photos and write + access to the contacts. + + [ + { + "type": "customer_information", + "locations": [ + "https://example.com/customers" + ], + "actions": [ + "read", + "write" + ], + "datatypes": [ + "contacts", + "photos" + ] + } + ] + + Figure 5: Example of "authorization_details" with Common Data Fields + + If the client wishes to have finer control over its access, it can + send multiple objects. In this example, the client is asking for + read access to the contacts and write access to the photos in the + same API endpoint. If this request is granted, the client would not + be able to write to the contacts. + + [ + { + "type": "customer_information", + "locations": [ + "https://example.com/customers" + ], + "actions": [ + "read" + ], + "datatypes": [ + "contacts" + ] + }, + { + "type": "customer_information", + "locations": [ + "https://example.com/customers" + ], + "actions": [ + "write" + ], + "datatypes": [ + "photos" + ] + } + ] + + Figure 6: Example of "authorization_details" with Common Data + Fields in Multiple Objects + + An API MAY define its own extensions, subject to the type of the + respective authorization object. It is anticipated that API + designers will use a combination of common data fields defined in + this specification as well as fields specific to the API itself. The + following non-normative example shows the use of both common and API- + specific fields as part of two different fictitious API type values. + The first access request includes the actions, locations, and + datatypes fields specified here as well as the API-specific + geolocation field, indicating access to photos taken at the given + coordinates. The second access request includes the actions and + identifier fields specified here as well as the API-specific currency + fields. + + [ + { + "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" + } + ] + + Figure 7: Example of "authorization_details" Using Common and + Extension Data Fields + + If this request is approved, the resulting access token's access + rights will be the union of the requested types of access for each of + the two APIs, just as above. + +3. Authorization Request + + The authorization_details authorization request parameter can be used + to specify authorization requirements in all places where the scope + parameter is used for the same purpose, examples include: + + * authorization requests as specified in [RFC6749] + + * device authorization requests as specified in [RFC8628] + + * backchannel authentication requests as defined in [OID-CIBA] + + In case of authorization requests as defined in [RFC6749], + implementers MAY consider using pushed authorization requests + [RFC9126] to improve the security, privacy, and reliability of the + flow. See Sections 12, 13, and 11.4 for details. + + Parameter encoding is determined by the respective context. In the + context of an authorization request according to [RFC6749], the + parameter is encoded using the application/x-www-form-urlencoded + format of the serialized JSON as shown in Figure 8, using the example + from Section 2 (line breaks for display purposes only): + + GET /authorize?response_type=code + &client_id=s6BhdRkqt3 + &state=af0ifjsldkj + &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb + &code_challenge_method=S256 + &code_challenge=K2-ltc83acc4h0c9w6ESC_rEMTJ3bwc-uCHaoeK1t8U + &authorization_details=%5B%7B%22type%22%3A%22account%5Finfo + rmation%22%2C%22actions%22%3A%5B%22list%5Faccounts%22%2C%22 + read%5Fbalances%22%2C%22read%5Ftransactions%22%5D%2C%22loca + tions%22%3A%5B%22https%3A%2F%2Fexample%2Ecom%2Faccounts%22% + 5D%7D%2C%7B%22type%22%3A%22payment%5Finitiation%22%2C%22act + ions%22%3A%5B%22initiate%22%2C%22status%22%2C%22cancel%22%5 + D%2C%22locations%22%3A%5B%22https%3A%2F%2Fexample%2Ecom%2Fp + ayments%22%5D%2C%22instructedAmount%22%3A%7B%22currency%22% + 3A%22EUR%22%2C%22amount%22%3A%22123%2E50%22%7D%2C%22credito + rName%22%3A%22Merchant%20A%22%2C%22creditorAccount%22%3A%7B + %22iban%22%3A%22DE02100100109307118603%22%7D%2C%22remittanc + eInformationUnstructured%22%3A%22Ref%20Number%20Merchant%22 + %7D%5D HTTP/1.1 + Host: server.example.com + + Figure 8: Example of Authorization Request with + "authorization_details" + + Based on the data provided in the authorization_details parameter, + the AS will ask the user for consent to the requested access + permissions. + + | Note: The user may also grant a subset of the requested + | authorization details. + + In Figure 9, the client wants to get access to account information + and initiate a payment: + + [ + { + "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" + } + ] + + Figure 9: URL Decoded "authorization_details" + +3.1. Relationship to the "scope" Parameter + + authorization_details and scope can be used in the same authorization + request for carrying independent authorization requirements. + + Combined use of authorization_details and scope is supported by this + specification in part to allow existing OAuth-based applications to + incrementally migrate towards using authorization_details + exclusively. It is RECOMMENDED that a given API use only one form of + requirement specification. + + The AS MUST process both sets of requirements in combination with + each other for the given authorization request. The details of how + the AS combines these parameters are specific to the APIs being + protected and outside the scope of this specification. + + When gathering user consent, the AS MUST present the merged set of + requirements represented by the authorization request. + + If the resource owner grants the client the requested access, the AS + will issue tokens to the client that are associated with the + respective authorization_details (and scope values, if applicable). + +3.2. Relationship to the "resource" Parameter + + The resource authorization request parameter, as defined in + [RFC8707], can be used to further determine the resources where the + requested scope can be applied. The resource parameter does not have + any impact on the way the AS processes the authorization_details + authorization request parameter. + +4. Authorization Response + + This specification does not define extensions to the authorization + response. + +5. Authorization Error Response + + The AS MUST refuse to process any unknown authorization details type + or authorization details not conforming to the respective type + definition. The AS MUST abort processing and respond with an error + invalid_authorization_details to the client if any of the following + are true of the objects in the authorization_details structure: + + * contains an unknown authorization details type value, + + * is an object of known type but containing unknown fields, + + * contains fields of the wrong type for the authorization details + type, + + * contains fields with invalid values for the authorization details + type, or + + * is missing required fields for the authorization details type. + +6. Token Request + + The authorization_details token request parameter can be used to + specify the authorization details that a client wants the AS to + assign to an access token. The AS checks whether the underlying + grant (in case of grant types authorization_code, refresh_token, + etc.) or the client's policy (in case of grant type + client_credentials) allows the issuance of an access token with the + requested authorization details. Otherwise, the AS refuses the + request with the error code invalid_authorization_details (similar to + invalid_scope). + +6.1. Comparing Authorization Details + + Many actions in the OAuth protocol allow the AS and RS to make + security decisions based on whether the request is asking for "more" + or "less" than a previous, existing request. For example, upon + refreshing a token, the client can ask for a new access token with + "fewer permissions" than had been previously authorized by the + resource owner. The requested access token will convey the reduced + permissions, but the resource owner's previous authorization is + unchanged by such requests. Since the semantics of the fields in the + authorization_details will be implementation specific to a given API + or set of APIs, there is no standardized mechanism to compare two + arbitrary authorization detail requests. An AS should not rely on + simple object comparison in most cases, as the intersection of some + fields within a request could have side effects on the access rights + granted, depending on how the API has been designed and deployed. + This is a similar effect to the scope values used with some APIs. + + When comparing a new request to an existing request, an AS can use + the same processing techniques as used in granting the request in the + first place to determine if a resource owner needs to authorize the + request. The details of this comparison are dependent on the + definition of the type of authorization request and outside the scope + of this specification, but common patterns can be applied. + + This shall be illustrated using our running example. The example + authorization request in Section 3, if approved by the user, resulted + in the issuance of an authorization code associated with the + privileges to: + + * list accounts, + + * access the balance of one or more accounts, + + * access the transactions of one or more accounts, and + + * initiate, check the status of, and cancel a payment. + + The client could now request the AS to issue an access token assigned + with the privilege to just access a list of accounts as follows: + + [ + { + "type": "account_information", + "actions": [ + "list_accounts" + ], + "locations": [ + "https://example.com/accounts" + ] + } + ] + + Figure 10: Example of "authorization_details" Reduced Privileges + + The example API is designed such that each field used by the + account_information type contains additive rights, with each value + within the actions and locations arrays specifying a different + element of access. To make a comparison in this instance, the AS + would perform the following steps: + + * verify that the authorization code issued in the previous step + contains an authorization details object of type + account_information, + + * verify whether the approved list of actions contains + list_accounts, and + + * verify whether the locations value includes only previously + approved locations. + + If all checks succeed, the AS would issue the requested access token + with the reduced set of access. + + Note that this comparison is relevant to this specific API type + definition. A different API type definition could have different + processing rules. For example, an actions value could subsume the + rights associated with another actions value. For example, if a + client initially asks for a token with write access, this implies + both read and write access to this API: + + [ + { + "type": "example_api", + "actions": [ + "write" + ] + } + ] + + Figure 11: Example of "authorization_details" Requesting "write" + Access to an API + + Later, that same client makes a refresh request for read access: + + [ + { + "type": "example_api", + "actions": [ + "read" + ] + } + ] + + Figure 12: Example of "authorization_details" Requesting "read" + Access to an API + + The AS would compare the type value and the actions value to + determine that the read access is already covered by the write access + previously granted to the client. + + This same API could be designed with a possible value for privileges + of admin, used in this example to denote that the resulting token is + allowed to perform any of the functions on the resources. If that + client is then granted such admin privileges to the API, the + authorization_details would be as follows: + + [ + { + "type": "example_api", + "privileges": [ + "admin" + ] + } + ] + + Figure 13: Example of "authorization_details" with "admin" Access + to an API + + The AS would compare the type value and find that the privileges + value subsumes any aspects of read or write access that had been + granted to the client previously. Note that other API definitions + can use privileges such that values do not subsume one another. + + The next example shows how the client can use the common data element + locations (see Section 2.2) to request the issuance of an access + token restricted to a certain RS. In our running example, the client + may ask for all permissions of the approved grant of type + payment_initiation applicable to the RS residing at + https://example.com/payments as follows: + + [ + { + "type": "payment_initiation", + "locations": [ + "https://example.com/payments" + ] + } + ] + + Figure 14: Example of "authorization_details" Requesting an + Audience-Restricted Access Token + +7. Token Response + + In addition to the token response parameters as defined in [RFC6749], + the AS MUST also return the authorization_details as granted by the + resource owner and assigned to the respective access token. + + The authorization details assigned to the access token issued in a + token response are determined by the authorization_details parameter + of the corresponding token request. If the client does not specify + the authorization_details token request parameters, the AS determines + the resulting authorization_details at its discretion. + + The AS MAY omit values in the authorization_details to the client. + + For our running example, it would look like this: + + HTTP/1.1 200 OK + Content-Type: application/json + Cache-Control: no-store + + { + "access_token": "2YotnFZFEjr1zCsicMWpAA", + "token_type": "example", + "expires_in": 3600, + "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA", + "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" + } + ] + } + + Figure 15: Example Token Response + +7.1. Enriched Authorization Details in Token Response + + The authorization details attached to the access token MAY differ + from what the client requests. In addition to the user authorizing + less than what the client requested, there are some use cases where + the AS enriches the data in an authorization details object. Whether + enrichment is allowed and specifics of how it works are necessarily + part of the definition of the respective authorization details type. + + As one example, a client may ask for access to account information + but leave the decision about the specific accounts it will be able to + access to the user. During the course of the authorization process, + the user would select the subset of their accounts that they want to + allow the client to access. As one design option to convey the + selected accounts, the AS could add this information to the + respective authorization details object. + + In that example, the requested authorization_details parameter might + look like the following. In this example, the empty arrays serve as + placeholders for where data will be added during enrichment by the + AS. This example is illustrative only and is not intended to suggest + a preference for designing the specifics of any authorization details + type this way. + + "authorization_details": [ + { + "type": "account_information", + "access": { + "accounts": [], + "balances": [], + "transactions": [] + }, + "recurringIndicator":true + } + ] + + Figure 16: Example of Requested "authorization_details" + + The AS then would expand the authorization details object and add the + respective account identifiers. + + HTTP/1.1 200 OK + Content-Type: application/json + Cache-Control: no-store + + { + "access_token":"2YotnFZFEjr1zCsicMWpAA", + "token_type":"example", + "expires_in":3600, + "refresh_token":"tGzv3JokF0XG5Qx2TlKWIA", + "authorization_details":[ + { + "type":"account_information", + "access":{ + "accounts":[ + { + "iban":"DE2310010010123456789" + }, + { + "maskedPan":"123456xxxxxx1234" + } + ], + "balances":[ + { + "iban":"DE2310010010123456789" + } + ], + "transactions":[ + { + "iban":"DE2310010010123456789" + }, + { + "maskedPan":"123456xxxxxx1234" + } + ] + }, + "recurringIndicator":true + } + ] + } + + Figure 17: Example of Enriched "authorization_details" + + For another example, the client is asking for access to a medical + record but does not know the record number at request time. In this + example, the client specifies the type of access it wants but doesn't + specify the location or identifier of that access. + + { + "authorization_details": [ + { + "type": "medical_record", + "sens": [ "HIV", "ETH", "MART" ], + "actions": [ "read" ], + "datatypes": [ "Patient", "Observation", "Appointment" ] + } + ]} + + Figure 18: Example of Requested "authorization_details" + + When the user interacts with the AS, they select which of the medical + records they are responsible for giving to the client. This + information gets returned with the access token. + + { + "access_token":"2YotnFZFEjr1zCsicMWpAA", + "token_type":"example", + "expires_in":3600, + "refresh_token":"tGzv3JokF0XG5Qx2TlKWIA", + "authorization_details":[ + { + "type": "medical_record", + "sens": [ "HIV", "ETH", "MART" ], + "actions": [ "read" ], + "datatypes": [ "Patient", "Observation", "Appointment" ], + "identifier": "patient-541235", + "locations": [ "https://records.example.com/" ] + } + ] + } + + Figure 19: Example of Enriched "authorization_details" + + | Note: The client needs to be aware upfront of the possibility + | that a certain authorization details object can be enriched. + | It is assumed that this property is part of the definition of + | the respective authorization details type. + +8. Token Error Response + + The Token Error Response MUST conform to the rules given in + Section 5. + +9. Resource Servers + + In order to enable the RS to enforce the authorization details as + approved in the authorization process, the AS MUST make this data + available to the RS. The AS MAY add the authorization_details field + to access tokens in JSON Web Token (JWT) format or to token + introspection responses. + +9.1. JWT-Based Access Tokens + + If the access token is a JWT [RFC7519], the AS is RECOMMENDED to add + the authorization details object, filtered to the specific audience, + as a top-level claim. + + The AS will typically also add further claims to the JWT that the RS + requires request processing, e.g., user ID, roles, and transaction- + specific data. What claims the particular RS requires is defined by + the RS-specific policy with the AS. + + The following shows the contents of an example JWT for the payment + initiation example above: + + { + "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" + } + } + + Figure 20: Example of "authorization_details" in JWT-Based Access + Token + + In this case, the AS added the following example claims to the JWT- + based access token: + + sub: indicates the user for which the client is asking for payment + initiation. + + txn: transaction id used to trace the transaction across the + services of provider example.com + + debtorAccount: API-specific field containing the debtor account. In + the example, this account was not passed in the + authorization_details but was selected by the user during the + authorization process. The field user_role conveys the role the + user has with respect to this particular account. In this case, + they are the owner. This data is used for access control at the + payment API (the RS). + +9.2. Token Introspection + + Token introspection [RFC7662] provides a means for an RS to query the + AS to determine information about an access token. If the AS + includes authorization detail information for the token in its + response, the information MUST be conveyed with authorization_details + as a top-level member of the introspection response JSON object. The + authorization_details member MUST contain the same structure defined + in Section 2, potentially filtered and extended for the RS making the + introspection request. + + Here is an example introspection response for the payment initiation + example: + + { + "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" + } + } + + Figure 21: Example of "authorization_details" in Introspection + Response + +10. Metadata + + To advertise its support for this feature, the supported list of + authorization details types is included in the AS metadata response + [RFC8414] using the metadata parameter + authorization_details_types_supported, which is a JSON array. + + This is illustrated by the following example: + + { + ... + "authorization_details_types_supported":[ + "payment_initiation", + "account_information" + ] + } + + Figure 22: Example of Server Metadata about the Supported + Authorization Details + + Clients MAY indicate the authorization details types they will use + when requesting authorization with the client registration metadata + parameter authorization_details_types, which is a JSON array. + + This is illustrated by the following example: + + { + ... + "authorization_details_types":[ + "payment_initiation" + ] + } + + Figure 23: Example of Server Metadata about Authorization Details + + The registration of authorization details types with the AS is + outside the scope of this specification. + +11. Implementation Considerations + +11.1. Using Authorization Details in a Certain Deployment + + Using authorization details in a certain deployment will require the + following steps: + + * Define authorization details types. + + * Publish authorization details types in the OAuth server metadata. + + * Determine how authorization details are shown to the user in the + user consent prompt. + + * If needed, enrich authorization details in the user consent + process (e.g., add selected accounts or set expirations). + + * If needed, determine how authorization details are reflected in + access token content or introspection responses. + + * Determine how the RSs process the authorization details or token + data derived from authorization details. + + * If needed, entitle clients to use certain authorization details + types. + +11.2. Minimal Implementation Support + + General AS implementations supporting this specification should + provide the following basic functions: + + * Support advertisement of supported authorization details types in + OAuth server metadata + + * Accept the authorization_details parameter in authorization + requests in conformance with this specification + + * Support storage of consented authorization details as part of a + grant + + * Implement default behavior for adding authorization details to + access tokens and token introspection responses in order to make + them available to RSs (similar to scope values). This should work + with any grant type, especially authorization_code and + refresh_token. + + Processing and presentation of authorization details will vary + significantly among different authorization details types. + Implementations should therefore support customization of the + respective behavior. In particular, implementations should allow + deployments to: + + * determine presentation of the authorization details; + + * modify requested authorization details in the user consent + process, e.g., adding fields; and + + * merge requested and preexisting authorization details. + + One approach to supporting such customization would be to have a + mechanism allowing the registration of extension modules, each of + them responsible for rendering the respective user consent and any + transformation needed to provide the data needed to the RS by way of + structured access tokens or token introspection responses. + +11.3. Use of Machine-Readable Type Schemas + + Implementations might allow deployments to use machine-readable + schema languages for defining authorization details types to + facilitate creating and validating authorization details objects + against such schemas. For example, if an authorization details type + were defined using JSON Schemas [JSON.Schema], the JSON Schema + identifier could be used as type value in the respective + authorization details objects. + + Note, however, that type values are identifiers understood by the AS + and, to the extent necessary, the client and RS. This specification + makes no assumption that a type value would point to a machine- + readable schema format or that any party in the system (such as the + client, AS, or RS) would dereference or process the contents of the + type field in any specific way. + +11.4. Large Requests + + Authorization request URIs containing authorization_details in a + request parameter or a request object can become very long. + Therefore, implementers should consider using the request_uri + parameter as defined in [RFC9101] in combination with the pushed + request object mechanism as defined in [RFC9126] to pass + authorization_details in a reliable and secure manner. Here is an + example of such a pushed authorization request that sends the + authorization request data directly to the AS via an HTTPS-protected + connection: + + POST /as/par HTTP/1.1 + Host: as.example.com + Content-Type: application/x-www-form-urlencoded + Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3 + + response_type=code& + client_id=s6BhdRkqt3 + &state=af0ifjsldkj + &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb + &code_challenge_method=S256 + &code_challenge=K2-ltc83acc4h0c9w6ESC_rEMTJ3bwc-uCHaoeK1t8U + &authorization_details=%5B%7B%22type%22%3A%22account_information%22 + %2C%22actions%22%3A%5B%22list_accounts%22%2C%22read_balances%22%2C% + 22read_transactions%22%5D%2C%22locations%22%3A%5B%22https%3A%2F%2Fe + xample.com%2Faccounts%22%5D%7D%2C%7B%22type%22%3A%22payment_initiat + ion%22%2C%22actions%22%3A%5B%22initiate%22%2C%22status%22%2C%22canc + el%22%5D%2C%22locations%22%3A%5B%22https%3A%2F%2Fexample.com%2Fpaym + ents%22%5D%2C%22instructedAmount%22%3A%7B%22currency%22%3A%22EUR%22 + %2C%22amount%22%3A%22123.50%22%7D%2C%22creditorName%22%3A%22Merchan + t123%22%2C%22creditorAccount%22%3A%7B%22iban%22%3A%22DE021001001093 + 07118603%22%7D%2C%22remittanceInformationUnstructured%22%3A%22Ref%2 + 0Number%20Merchant%22%7D%5D + + Figure 24: Example of Large Request including "authorization_details" + +12. Security Considerations + + The authorization_details parameter is sent through the user agent in + case of an OAuth authorization request, which makes them vulnerable + to modifications by the user. If the integrity of the + authorization_details is a concern, clients MUST protect + authorization_details against tampering and swapping. This can be + achieved by signing the request using signed request objects as + defined in [RFC9101] or using the request_uri authorization request + parameter as defined in [RFC9101] in conjunction with [RFC9126] to + pass the URI of the request object to the AS. + + All string comparisons in an authorization_details parameter are to + be done as defined by [RFC8259]. No additional transformation or + normalization is to be done in evaluating equivalence of string + values. + + The common data field locations allows a client to specify where it + intends to use a certain authorization, i.e., it is possible to + unambiguously assign permissions to RSs. In situations with multiple + RSs, this prevents unintended client authorizations (e.g., a read + scope value potentially applicable for an email as well as a cloud + service) through audience restriction. + + The AS MUST properly sanitize and handle the data passed in the + authorization_details in order to prevent injection attacks. + + The Security Considerations of [RFC6749], [RFC7662], and [RFC8414] + also apply. + +13. Privacy Considerations + + It is especially important for implementers to design and use + authorization details in a privacy-preserving manner. + + Any sensitive personal data included in authorization_details must be + prevented from leaking, e.g., through referrer headers. + Implementation options include encrypted request objects as defined + in [RFC9101] or transmission of authorization_details via end-to-end + encrypted connections between client and AS by utilizing [RFC9126] + and the request_uri authorization request parameter as defined in + [RFC9101]. The latter does not require application-level encryption, + but it requires another message exchange between the client and the + AS. + + Even if the request data is encrypted, an attacker could use the AS + to learn the user's data by injecting the encrypted request data into + an authorization request on a device under their control and use the + AS's user consent screens to show the (decrypted) user data in the + clear. Implementations need to consider this attack vector and + implement appropriate countermeasures, e.g., by only showing portions + of the data or, if possible, determining whether the assumed user + context is still the same (after user authentication). + + The AS needs to take into consideration the privacy implications when + sharing authorization_details with the client or RSs. The AS should + share this data with those parties on a "need to know" basis as + determined by local policy. + +14. IANA Considerations + +14.1. OAuth Parameters Registration + + The following parameter has been registered in the "OAuth Parameters" + registry [IANA.OAuth.Parameters] established by [RFC6749]. + + Name: authorization_details + + Parameter Usage Location: authorization request, token request, + token response + + Change Controller: IETF + + Reference: RFC 9396 + +14.2. JSON Web Token Claims Registration + + The following value has been registered in the IANA "JSON Web Token + Claims" registry established by [RFC7519]. + + Claim Name: authorization_details + + Claim Description: The claim authorization_details contains a JSON + array of JSON objects representing the rights of the access token. + Each JSON object contains the data to specify the authorization + requirements for a certain type of resource. + + Change Controller: IETF + + Reference: Section 9.1 of RFC 9396 + +14.3. OAuth Token Introspection Response Registration + + The following value has been registered in the IANA "OAuth Token + Introspection Response" registry established by [RFC7662]. + + Name: authorization_details + + Description: The member authorization_details contains a JSON array + of JSON objects representing the rights of the access token. Each + JSON object contains the data to specify the authorization + requirements for a certain type of resource. + + Change Controller: IETF + + Reference: Section 9.2 of RFC 9396 + +14.4. OAuth Authorization Server Metadata Registration + + The following values have been registered in the IANA "OAuth + Authorization Server Metadata" registry of [IANA.OAuth.Parameters] + established by [RFC8414]. + + Metadata Name: authorization_details_types_supported + + Metadata Description: JSON array containing the authorization + details types the AS supports + + Change Controller: IETF + + Reference: Section 10 of RFC 9396 + +14.5. OAuth Dynamic Client Registration Metadata Registration + + The following value has been registered in the IANA "OAuth Dynamic + Client Registration Metadata" registry of [IANA.OAuth.Parameters] + established by [RFC7591]. + + Client Metadata Name: authorization_details_types + + Client Metadata Description: Indicates what authorization details + types the client uses. + + Change Controller: IETF + + Reference: Section 10 of RFC 9396 + +14.6. OAuth Extensions Error Registration + + The following value has been registered in the IANA "OAuth Extensions + Error Registry" of [IANA.OAuth.Parameters] established by [RFC6749]. + + Name: invalid_authorization_details + + Usage Location: token endpoint, authorization endpoint + + Protocol Extension: OAuth 2.0 Rich Authorization Requests + + Change Controller: IETF + + Reference: Section 5 of RFC 9396 + +15. References + +15.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token + (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, + <https://www.rfc-editor.org/info/rfc7519>. + + [RFC7662] Richer, J., Ed., "OAuth 2.0 Token Introspection", + RFC 7662, DOI 10.17487/RFC7662, October 2015, + <https://www.rfc-editor.org/info/rfc7662>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8414] Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 + Authorization Server Metadata", RFC 8414, + DOI 10.17487/RFC8414, June 2018, + <https://www.rfc-editor.org/info/rfc8414>. + + [RFC8628] Denniss, W., Bradley, J., Jones, M., and H. Tschofenig, + "OAuth 2.0 Device Authorization Grant", RFC 8628, + DOI 10.17487/RFC8628, August 2019, + <https://www.rfc-editor.org/info/rfc8628>. + + [RFC8707] Campbell, B., Bradley, J., and H. Tschofenig, "Resource + Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707, + February 2020, <https://www.rfc-editor.org/info/rfc8707>. + +15.2. Informative References + + [CSC] Cloud Signature Consortium, "Architectures and protocols + for remote signature applications", Version 1.0.4.0, June + 2019, <https://cloudsignatureconsortium.org/wp- + content/uploads/2020/01/CSC_API_V1_1.0.4.0.pdf>. + + [ETSI] ETSI, "Electronic Signatures and Infrastructures (ESI); + Protocols for remote digital signature creation", V1.1.1, + ETSI TS 119 432, March 2019, + <https://www.etsi.org/deliver/ + etsi_ts/119400_119499/119432/01.01.01_60/ + ts_119432v010101p.pdf>. + + [IANA.OAuth.Parameters] + IANA, "OAuth Parameters", + <https://www.iana.org/assignments/oauth-parameters>. + + [JSON.Schema] + OpenJS Foundation, "JSON Schema", + <https://json-schema.org/>. + + [OID-CIBA] Fernandez, G., Walter, F., Nennker, A., Tonge, D., and B. + Campbell, "OpenID Connect Client-Initiated Backchannel + Authentication Flow - Core 1.0", 1 September 2021, + <https://openid.net/specs/openid-client-initiated- + backchannel-authentication-core-1_0.html>. + + [OIDC] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and + C. Mortimore, "OpenID Connect Core 1.0 incorporating + errata set 1", 8 November 2014, + <https://openid.net/specs/openid-connect-core-1_0.html>. + + [RFC0020] Cerf, V., "ASCII format for network interchange", STD 80, + RFC 20, DOI 10.17487/RFC0020, October 1969, + <https://www.rfc-editor.org/info/rfc20>. + + [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", + RFC 6749, DOI 10.17487/RFC6749, October 2012, + <https://www.rfc-editor.org/info/rfc6749>. + + [RFC7591] Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and + P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", + RFC 7591, DOI 10.17487/RFC7591, July 2015, + <https://www.rfc-editor.org/info/rfc7591>. + + [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data + Interchange Format", STD 90, RFC 8259, + DOI 10.17487/RFC8259, December 2017, + <https://www.rfc-editor.org/info/rfc8259>. + + [RFC9101] Sakimura, N., Bradley, J., and M. Jones, "The OAuth 2.0 + Authorization Framework: JWT-Secured Authorization Request + (JAR)", RFC 9101, DOI 10.17487/RFC9101, August 2021, + <https://www.rfc-editor.org/info/rfc9101>. + + [RFC9126] Lodderstedt, T., Campbell, B., Sakimura, N., Tonge, D., + and F. Skokan, "OAuth 2.0 Pushed Authorization Requests", + RFC 9126, DOI 10.17487/RFC9126, September 2021, + <https://www.rfc-editor.org/info/rfc9126>. + + [Transaction-Auth] + Lodderstedt, T., "Transaction Authorization or why we need + to re-think OAuth scopes", 20 April 2019, + <https://medium.com/oauth-2/transaction-authorization-or- + why-we-need-to-re-think-oauth-scopes-2326e2038948>. + +Appendix A. Additional Examples + +A.1. OpenID Connect + + OpenID Connect [OIDC] specifies the JSON-based claims request + parameter that can be used to specify the claims a client (acting as + an OpenID Connect Relying Party) wishes to receive in a fine-grained + and privacy-preserving way as well as assign those claims to certain + delivery mechanisms, i.e., ID Token or userinfo response. + + The combination of the scope value openid and the additional + parameter claims can be used beside authorization_details in the same + way as every non-OIDC scope value. + + Alternatively, there could be an authorization details type for + OpenID Connect. This section gives an example of what such an + authorization details type could look like, but defining this + authorization details type is outside the scope of this + specification. + + These hypothetical examples try to encapsulate all details specific + to the OpenID Connect part of an authorization process into an + authorization JSON object. + + The top-level fields are based on the definitions given in [OIDC]: + + claim_sets: the names of predefined claim sets, replacement for + respective scope values, such as profile + + max_age: Maximum Authentication Age + + acr_values: requested Authentication Context Class Reference (ACR) + values + + claims: the claims JSON structure as defined in [OIDC] + + This is a simple request for some claim sets. + + [ + { + "type": "openid", + "locations": [ + "https://op.example.com/userinfo" + ], + "claim_sets": [ + "email", + "profile" + ] + } + ] + + Figure 25: Example of OpenID Connect Request Utilizing + "authorization_details" + + | Note: locations specifies the location of the userinfo endpoint + | since this is the only place where an access token is used by a + | client (Relying Party) in OpenID Connect to obtain claims. + + A more sophisticated example is shown in Figure 26. + + [ + { + "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 + } + } + } + } + ] + + Figure 26: Advanced Example of OpenID Connect Request Utilizing + "authorization_details" + +A.2. Remote Electronic Signing + + The following example is based on the concept laid out for remote + electronic signing in ETSI TS 119 432 [ETSI] and the Cloud Signature + Consortium (CSC) API for remote signature creation [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" + } + ] + + Figure 27: Example of Electronic Signing + + The top-level fields have the following meaning: + + credentialID: identifier of the certificate to be used for signing + + documentDigests: array containing the hash of every document to be + signed (hash fields). Additionally, the corresponding label field + identifies the respective document to the user, e.g., to be used + in user consent. + + hashAlgorithm: algorithm that was used to calculate the hash values + + The AS is supposed to ask the user for consent for the creation of + signatures for the documents listed in the structure. The client + uses the access token issued as a result of the process to call the + document signature API at the respective signing service to actually + create the signature. This access token is bound to the client, the + user ID and the hashes (and signature algorithm) as consented by the + user. + +A.3. Access to Tax Data + + This example is inspired by an API allowing third parties to access + citizen's tax declarations and income statements, for example, to + determine their creditworthiness. + + [ + { + "type": "tax_data", + "locations": [ + "https://taxservice.govehub.no.example.com" + ], + "actions":"read_tax_declaration", + "periods": ["2018"], + "duration_of_access": 30, + "tax_payer_id": "23674185438934" + } + ] + + Figure 28: Example of Tax Data Access + + The top-level fields have the following meaning: + + periods: the periods the client wants to access + + duration_of_access: how long the clients intend to access the data + in days + + tax_payer_id: identifier of the taxpayer (if known to the client) + +A.4. eHealth + + These two examples are inspired by requirements for APIs used in the + Norwegian eHealth system. + + In this use case, the physical therapist sits in front of their + computer using a local Electronic Health Records (EHR) system. They + want to look at the electronic patient records of a certain patient, + and they also want to fetch the patient's journal entries in another + system, perhaps at another institution or a national service. Access + to this data is provided by an API. + + The information necessary to authorize the request at the API is only + known by the EHR system and must be presented to the API. + + In the first example, the authorization details object contains the + identifier of an organization. In this case, the API needs to know + if the given organization has the lawful basis for processing + personal health information to give access to sensitive data. + + "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]" + } + } + } + } + } + + Figure 29: eHealth Example + + In the second example, the API requires more information to authorize + the request. In this case, the authorization details object contains + additional information about the health institution and the current + profession the user has at the time of the request. The additional + level of detail could be used for both authorization and data + minimization. + + [ + { + "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" + } + ] + } + } + } + } + ] + + Figure 30: Advanced eHealth Example + + Description of the fields: + + patient_identifier: the identifier of the patient composed of a + system identifier in OID format (namespace) and the actual value + within this namespace. + + reason_for_request: the reason why the user wants to access a + certain API. + + requesting_entity: specification of the requester by means of + identity, role and organizational context. This data is provided + to facilitate authorization and for auditing purposes. + + In this use case, the AS authenticates the requester, who is not the + patient, and approves access based on policies. + +Acknowledgements + + We would like to thank Daniel Fett, Sebastian Ebling, Dave Tonge, + Mike Jones, Nat Sakimura, and Rob Otto for their valuable feedback + during the preparation of this specification. + + We would also like to thank Vladimir Dzhuvinov, Takahiko Kawasaki, + Daniel Fett, Dave Tonge, Travis Spencer, Joergen Binningsboe, Aamund + Bremer, Steinar Noem, Francis Pouatcha, Jacob Ideskog, Hannes + Tschofenig, and Aaron Parecki for their valuable feedback to this + specification. + +Authors' Addresses + + Torsten Lodderstedt + yes.com + Email: torsten@lodderstedt.net + + + Justin Richer + Bespoke Engineering + Email: ietf@justin.richer.org + + + Brian Campbell + Ping Identity + Email: bcampbell@pingidentity.com |