| rfc9101.original | rfc9101.txt | |||
|---|---|---|---|---|
| OAuth Working Group N. Sakimura | Internet Engineering Task Force (IETF) N. Sakimura | |||
| Internet-Draft NAT.Consulting | Request for Comments: 9101 NAT.Consulting | |||
| Intended status: Standards Track J. Bradley | Category: Standards Track J. Bradley | |||
| Expires: October 10, 2021 Yubico | ISSN: 2070-1721 Yubico | |||
| M. Jones | M. Jones | |||
| Microsoft | Microsoft | |||
| April 8, 2021 | August 2021 | |||
| The OAuth 2.0 Authorization Framework: JWT Secured Authorization Request | The OAuth 2.0 Authorization Framework: JWT-Secured Authorization Request | |||
| (JAR) | (JAR) | |||
| draft-ietf-oauth-jwsreq-34 | ||||
| Abstract | Abstract | |||
| The authorization request in OAuth 2.0 described in RFC 6749 utilizes | The authorization request in OAuth 2.0 described in RFC 6749 utilizes | |||
| query parameter serialization, which means that Authorization Request | query parameter serialization, which means that authorization request | |||
| parameters are encoded in the URI of the request and sent through | parameters are encoded in the URI of the request and sent through | |||
| user agents such as web browsers. While it is easy to implement, it | user agents such as web browsers. While it is easy to implement, it | |||
| means that (a) the communication through the user agents is not | means that a) the communication through the user agents is not | |||
| integrity protected and thus the parameters can be tainted, (b) the | integrity protected and thus, the parameters can be tainted, b) the | |||
| source of the communication is not authenticated, and (c) the | source of the communication is not authenticated, and c) the | |||
| communication through the user agents can be monitored. Because of | communication through the user agents can be monitored. Because of | |||
| these weaknesses, several attacks to the protocol have now been put | these weaknesses, several attacks to the protocol have now been put | |||
| forward. | forward. | |||
| This document introduces the ability to send request parameters in a | This document introduces the ability to send request parameters in a | |||
| JSON Web Token (JWT) instead, which allows the request to be signed | JSON Web Token (JWT) instead, which allows the request to be signed | |||
| with JSON Web Signature (JWS) and encrypted with JSON Web Encryption | with JSON Web Signature (JWS) and encrypted with JSON Web Encryption | |||
| (JWE) so that the integrity, source authentication and | (JWE) so that the integrity, source authentication, and | |||
| confidentiality property of the Authorization Request is attained. | confidentiality properties of the authorization request are attained. | |||
| The request can be sent by value or by reference. | The request can be sent by value or by reference. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | This document is a product of the Internet Engineering Task Force | |||
| Task Force (IETF). Note that other groups may also distribute | (IETF). It represents the consensus of the IETF community. It has | |||
| working documents as Internet-Drafts. The list of current Internet- | received public review and has been approved for publication by the | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | Information about the current status of this document, any errata, | |||
| and may be updated, replaced, or obsoleted by other documents at any | and how to provide feedback on it may be obtained at | |||
| time. It is inappropriate to use Internet-Drafts as reference | https://www.rfc-editor.org/info/rfc9101. | |||
| material or to cite them other than as "work in progress." | ||||
| This Internet-Draft will expire on October 10, 2021. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Language | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2. Terminology | |||
| 2.1. Request Object . . . . . . . . . . . . . . . . . . . . . 6 | 2.1. Request Object | |||
| 2.2. Request Object URI . . . . . . . . . . . . . . . . . . . 6 | 2.2. Request Object URI | |||
| 3. Symbols and abbreviated terms . . . . . . . . . . . . . . . . 6 | 3. Symbols and Abbreviated Terms | |||
| 4. Request Object . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. Request Object | |||
| 5. Authorization Request . . . . . . . . . . . . . . . . . . . . 9 | 5. Authorization Request | |||
| 5.1. Passing a Request Object by Value . . . . . . . . . . . . 10 | 5.1. Passing a Request Object by Value | |||
| 5.2. Passing a Request Object by Reference . . . . . . . . . . 10 | 5.2. Passing a Request Object by Reference | |||
| 5.2.1. URI Referencing the Request Object . . . . . . . . . 11 | 5.2.1. URI Referencing the Request Object | |||
| 5.2.2. Request using the "request_uri" Request Parameter . . 12 | 5.2.2. Request Using the "request_uri" Request Parameter | |||
| 5.2.3. Authorization Server Fetches Request Object . . . . . 12 | 5.2.3. Authorization Server Fetches Request Object | |||
| 6. Validating JWT-Based Requests . . . . . . . . . . . . . . . . 13 | 6. Validating JWT-Based Requests | |||
| 6.1. JWE Encrypted Request Object . . . . . . . . . . . . . . 13 | 6.1. JWE Encrypted Request Object | |||
| 6.2. JWS Signed Request Object . . . . . . . . . . . . . . . . 13 | 6.2. JWS-Signed Request Object | |||
| 6.3. Request Parameter Assembly and Validation . . . . . . . . 14 | 6.3. Request Parameter Assembly and Validation | |||
| 7. Authorization Server Response . . . . . . . . . . . . . . . . 14 | 7. Authorization Server Response | |||
| 8. TLS Requirements . . . . . . . . . . . . . . . . . . . . . . 14 | 8. TLS Requirements | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . 15 | 9. IANA Considerations | |||
| 9.1. OAuth Parameters Registration . . . . . . . . . . . . . . 15 | 9.1. OAuth Parameters Registration | |||
| 9.2. OAuth Authorization Server Metadata Registry . . . . . . 16 | 9.2. OAuth Authorization Server Metadata Registry | |||
| 9.3. OAuth Dynamic Client Registration Metadata Registry . . . 17 | 9.3. OAuth Dynamic Client Registration Metadata Registry | |||
| 9.4. Media Type Registration . . . . . . . . . . . . . . . . . 17 | 9.4. Media Type Registration | |||
| 9.4.1. Registry Contents . . . . . . . . . . . . . . . . . . 17 | 9.4.1. Registry Contents | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | 10. Security Considerations | |||
| 10.1. Choice of Algorithms . . . . . . . . . . . . . . . . . . 18 | 10.1. Choice of Algorithms | |||
| 10.2. Request Source Authentication . . . . . . . . . . . . . 18 | 10.2. Request Source Authentication | |||
| 10.3. Explicit Endpoints . . . . . . . . . . . . . . . . . . . 19 | 10.3. Explicit Endpoints | |||
| 10.4. Risks Associated with request_uri . . . . . . . . . . . 19 | 10.4. Risks Associated with request_uri | |||
| 10.4.1. DDoS Attack on the Authorization Server . . . . . . 20 | 10.4.1. DDoS Attack on the Authorization Server | |||
| 10.4.2. Request URI Rewrite . . . . . . . . . . . . . . . . 20 | 10.4.2. Request URI Rewrite | |||
| 10.5. Downgrade Attack . . . . . . . . . . . . . . . . . . . . 20 | 10.5. Downgrade Attack | |||
| 10.6. TLS Security Considerations . . . . . . . . . . . . . . 21 | 10.6. TLS Security Considerations | |||
| 10.7. Parameter Mismatches . . . . . . . . . . . . . . . . . . 21 | 10.7. Parameter Mismatches | |||
| 10.8. Cross-JWT Confusion . . . . . . . . . . . . . . . . . . 21 | 10.8. Cross-JWT Confusion | |||
| 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . 22 | 11. Privacy Considerations | |||
| 11.1. Collection limitation . . . . . . . . . . . . . . . . . 22 | 11.1. Collection Limitation | |||
| 11.2. Disclosure Limitation . . . . . . . . . . . . . . . . . 23 | 11.2. Disclosure Limitation | |||
| 11.2.1. Request Disclosure . . . . . . . . . . . . . . . . . 23 | 11.2.1. Request Disclosure | |||
| 11.2.2. Tracking using Request Object URI . . . . . . . . . 23 | 11.2.2. Tracking Using Request Object URI | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 24 | 12. References | |||
| 13. Revision History . . . . . . . . . . . . . . . . . . . . . . 24 | 12.1. Normative References | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 12.2. Informative References | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . 32 | Acknowledgements | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . 34 | Authors' Addresses | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
| 1. Introduction | 1. Introduction | |||
| The Authorization Request in OAuth 2.0 [RFC6749] utilizes query | The authorization request in OAuth 2.0 [RFC6749] utilizes query | |||
| parameter serialization and is typically sent through user agents | parameter serialization and is typically sent through user agents | |||
| such as web browsers. | such as web browsers. | |||
| For example, the parameters "response_type", "client_id", "state", | For example, the parameters "response_type", "client_id", "state", | |||
| and "redirect_uri" are encoded in the URI of the request: | and "redirect_uri" are encoded in the URI of the request: | |||
| GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz | GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz | |||
| &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 | &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| While it is easy to implement, the encoding in the URI does not allow | While it is easy to implement, the encoding in the URI does not allow | |||
| application layer security to be used to provide confidentiality and | application-layer security to be used to provide confidentiality and | |||
| integrity protection. While TLS is used to offer communication | integrity protection. While TLS is used to offer communication | |||
| security between the Client and the user-agent as well as the user- | security between the client and the user agent as well as the user | |||
| agent and the Authorization Server, TLS sessions are terminated in | agent and the authorization server, TLS sessions are terminated in | |||
| the user-agent. In addition, TLS sessions may be terminated | the user agent. In addition, TLS sessions may be terminated | |||
| prematurely at some middlebox (such as a load balancer). | prematurely at some middlebox (such as a load balancer). | |||
| As the result, the Authorization Request of [RFC6749] has | As a result, the authorization request of [RFC6749] has shortcomings | |||
| shortcomings in that: | in that: | |||
| (a) the communication through the user agents is not integrity | (a) the communication through the user agents is not integrity | |||
| protected and thus the parameters can be tainted (integrity | protected, and thus, the parameters can be tainted (integrity | |||
| protection failure) | protection failure); | |||
| (b) the source of the communication is not authenticated (source | (b) the source of the communication is not authenticated (source | |||
| authentication failure) | authentication failure); | |||
| (c) the communication through the user agents can be monitored | (c) the communication through the user agents can be monitored | |||
| (containment / confidentiality failure). | (containment/confidentiality failure). | |||
| Due to these inherent weaknesses, several attacks against the | Due to these inherent weaknesses, several attacks against the | |||
| protocol, such as Redirection URI rewriting, have been identified. | protocol, such as redirection URI rewriting, have been identified. | |||
| The use of application layer security mitigates these issues. | The use of application-layer security mitigates these issues. | |||
| The use of application layer security allows requests to be prepared | The use of application-layer security allows requests to be prepared | |||
| by a trusted third party so that a client application cannot request | by a trusted third party so that a client application cannot request | |||
| more permissions than previously agreed. | more permissions than previously agreed upon. | |||
| Furthermore, passing the request by reference allows the reduction of | Furthermore, passing the request by reference allows the reduction of | |||
| over-the-wire overhead. | over-the-wire overhead. | |||
| The JWT [RFC7519] encoding has been chosen because of | The JWT [RFC7519] encoding has been chosen because of: | |||
| (1) its close relationship with JSON, which is used as OAuth's | (1) its close relationship with JSON, which is used as OAuth's | |||
| response format | response format | |||
| (2) its developer friendliness due to its textual nature | (2) its developer friendliness due to its textual nature | |||
| (3) its relative compactness compared to XML | (3) its relative compactness compared to XML | |||
| (4) its development status as a Proposed Standard, along with the | (4) its development status as a Proposed Standard, along with the | |||
| associated signing and encryption methods [RFC7515] [RFC7516] | associated signing and encryption methods [RFC7515] [RFC7516] | |||
| (5) the relative ease of JWS and JWE compared to XML Signature and | (5) the relative ease of JWS and JWE compared to XML Signature and | |||
| Encryption. | Encryption. | |||
| The parameters "request" and "request_uri" are introduced as | The parameters "request" and "request_uri" are introduced as | |||
| additional authorization request parameters for the OAuth 2.0 | additional authorization request parameters for the OAuth 2.0 | |||
| [RFC6749] flows. The "request" parameter is a JSON Web Token (JWT) | [RFC6749] flows. The "request" parameter is a JSON Web Token (JWT) | |||
| [RFC7519] whose JWT Claims Set holds the JSON encoded OAuth 2.0 | [RFC7519] whose JWT Claims Set holds the JSON-encoded OAuth 2.0 | |||
| authorization request parameters. Note that, in contrast to RFC | authorization request parameters. Note that, in contrast to RFC | |||
| 7519, the elements of the Claims Set are encoded OAuth Request | 7519, the elements of the Claims Set are encoded OAuth request | |||
| Parameters [IANA.OAuth.Parameters], supplemented with only a few of | parameters [IANA.OAuth.Parameters], supplemented with only a few of | |||
| the IANA-managed JSON Web Token Claims [IANA.JWT.Claims] - in | the IANA-managed JSON Web Token Claims [IANA.JWT.Claims], in | |||
| particular "iss" and "aud". The JWT in the "request" parameter is | particular, "iss" and "aud". The JWT in the "request" parameter is | |||
| integrity protected and source authenticated using JWS. | integrity protected and source authenticated using JWS. | |||
| The JWT [RFC7519] can be passed to the authorization endpoint by | The JWT [RFC7519] can be passed to the authorization endpoint by | |||
| reference, in which case the parameter "request_uri" is used instead | reference, in which case the parameter "request_uri" is used instead | |||
| of the "request". | of "request". | |||
| Using JWT [RFC7519] as the request encoding instead of query | Using JWT [RFC7519] as the request encoding instead of query | |||
| parameters has several advantages: | parameters has several advantages: | |||
| (a) (integrity protection) The request can be signed so that the | (a) Integrity protection. The request can be signed so that the | |||
| integrity of the request can be checked. | integrity of the request can be checked. | |||
| (b) (source authentication) The request can be signed so that the | (b) Source authentication. The request can be signed so that the | |||
| signer can be authenticated. | signer can be authenticated. | |||
| (c) (confidentiality protection) The request can be encrypted so | (c) Confidentiality protection. The request can be encrypted so | |||
| that end-to-end confidentiality can be provided even if the TLS | that end-to-end confidentiality can be provided even if the TLS | |||
| connection is terminated at one point or another (including at | connection is terminated at one point or another (including at | |||
| and before user-agents). | and before user agents). | |||
| (d) (collection minimization) The request can be signed by a trusted | (d) Collection minimization. The request can be signed by a trusted | |||
| third party attesting that the authorization request is | third party attesting that the authorization request is | |||
| compliant with a certain policy. For example, a request can be | compliant with a certain policy. For example, a request can be | |||
| pre-examined by a trusted third party that all the personal data | pre-examined by a trusted third party to confirm that all the | |||
| requested is strictly necessary to perform the process that the | personal data requested is strictly necessary to perform the | |||
| end-user asked for, and signed by that trusted third party. The | process that the end user asked for; the request would then be | |||
| authorization server then examines the signature and shows the | signed by that trusted third party. The authorization server | |||
| conformance status to the end-user, who would have some | then examines the signature and shows the conformance status to | |||
| assurance as to the legitimacy of the request when authorizing | the end user who would have some assurance as to the legitimacy | |||
| it. In some cases, it may even be desirable to skip the | of the request when authorizing it. In some cases, it may even | |||
| authorization dialogue under such circumstances. | be desirable to skip the authorization dialogue under such | |||
| circumstances. | ||||
| There are a few cases that request by reference is useful such as: | There are a few cases where request by reference is useful, such as: | |||
| 1. When it is desirable to reduce the size of transmitted request. | 1. when it is desirable to reduce the size of a transmitted request. | |||
| The use of application layer security increases the size of the | The use of application-layer security increases the size of the | |||
| request, particularly when public key cryptography is used. | request particularly when public-key cryptography is used. | |||
| 2. When the client does not want to do the application level | 2. when the client does not want to do the application-level | |||
| cryptography. The Authorization Server may provide an endpoint | cryptography. The authorization server may provide an endpoint | |||
| to accept the Authorization Request through direct communication | to accept the authorization request through direct communication | |||
| with the Client so that the Client is authenticated and the | with the client, so that the client is authenticated and the | |||
| channel is TLS protected. | channel is TLS protected. | |||
| This capability is in use by OpenID Connect [OpenID.Core]. | This capability is in use by OpenID Connect [OpenID.Core]. | |||
| 1.1. Requirements Language | 1.1. Requirements Language | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| 2. Terminology | 2. Terminology | |||
| For the purposes of this specification, the following terms and | For the purposes of this specification, the following terms and | |||
| definitions in addition to what is defined in OAuth 2.0 Framework | definitions apply in addition to what is defined in OAuth 2.0 | |||
| [RFC6749], JSON Web Signature [RFC7515], and JSON Web Encryption | Framework [RFC6749], JSON Web Signature [RFC7515], and JSON Web | |||
| [RFC7519] apply. | Encryption [RFC7516]. | |||
| 2.1. Request Object | 2.1. Request Object | |||
| JSON Web Token (JWT) [RFC7519] whose JWT Claims Set holds the JSON | A Request Object is a JSON Web Token (JWT) [RFC7519] whose JWT Claims | |||
| encoded OAuth 2.0 authorization request parameters. | Set holds the JSON-encoded OAuth 2.0 authorization request | |||
| parameters. | ||||
| 2.2. Request Object URI | 2.2. Request Object URI | |||
| Absolute URI that references the set of parameters comprising an | A Request Object URI is an absolute URI that references the set of | |||
| OAuth 2.0 authorization request. The contents of the resource | parameters comprising an OAuth 2.0 authorization request. The | |||
| referenced by the URI are a Request Object (Section 2.1), unless the | content of the resource referenced by the URI is a Request Object | |||
| URI was provided to the client by the same Authorization Server, in | (Section 2.1), unless the URI was provided to the client by the same | |||
| which case the content is an implementation detail at the discretion | authorization server, in which case the content is an implementation | |||
| the Authorization Server. The former is to ensure interoperability | detail at the discretion of the authorization server. The content | |||
| in cases where the provider of the request_uri is a separate entity | being a Request Object is to ensure interoperability in cases where | |||
| from the consumer, such as when a client provides a URI referencing a | the provider of the "request_uri" is a separate entity from the | |||
| Request Object stored on the client's backend service and made | consumer, such as when a client provides a URI referencing a Request | |||
| accessible via HTTPS. In the latter case where the Authorization | Object stored on the client's backend service that is made accessible | |||
| Server is both provider and consumer of the URI, such as when it | via HTTPS. In the latter case, where the authorization server is | |||
| offers an endpoint that provides a URI in exchange for a Request | both provider and consumer of the URI, such as when it offers an | |||
| Object, this interoperability concern does not apply. | endpoint that provides a URI in exchange for a Request Object, this | |||
| interoperability concern does not apply. | ||||
| 3. Symbols and abbreviated terms | 3. Symbols and Abbreviated Terms | |||
| The following abbreviations are common to this specification. | The following abbreviations are common to this specification. | |||
| JSON JavaScript Object Notation | JSON: JavaScript Object Notation | |||
| JWT JSON Web Token | JWT: JSON Web Token | |||
| JWS JSON Web Signature | JWS: JSON Web Signature | |||
| JWE JSON Web Encryption | JWE: JSON Web Encryption | |||
| URI Uniform Resource Identifier | URI: Uniform Resource Identifier | |||
| URL Uniform Resource Locator | URL: Uniform Resource Locator | |||
| 4. Request Object | 4. Request Object | |||
| A Request Object (Section 2.1) is used to provide authorization | A Request Object (Section 2.1) is used to provide authorization | |||
| request parameters for an OAuth 2.0 authorization request. It MUST | request parameters for an OAuth 2.0 authorization request. It MUST | |||
| contain all the parameters (including extension parameters) used to | contain all the parameters (including extension parameters) used to | |||
| process the OAuth 2.0 [RFC6749] authorization request except the | process the OAuth 2.0 [RFC6749] authorization request except the | |||
| "request" and "request_uri" parameters that are defined in this | "request" and "request_uri" parameters that are defined in this | |||
| document. The parameters are represented as the JWT claims of the | document. The parameters are represented as the JWT Claims of the | |||
| object. Parameter names and string values MUST be included as JSON | object. Parameter names and string values MUST be included as JSON | |||
| strings. Since Request Objects are handled across domains and | strings. Since Request Objects are handled across domains and | |||
| potentially outside of a closed ecosystem, per section 8.1 of | potentially outside of a closed ecosystem, per Section 8.1 of | |||
| [RFC8259], these JSON strings MUST be encoded using UTF-8 [RFC3629]. | [RFC8259], these JSON strings MUST be encoded using UTF-8 [RFC3629]. | |||
| Numerical values MUST be included as JSON numbers. It MAY include | Numerical values MUST be included as JSON numbers. The Request | |||
| any extension parameters. This JSON [RFC8259] object constitutes the | Object MAY include any extension parameters. This JSON [RFC8259] | |||
| JWT Claims Set defined in JWT [RFC7519]. The JWT Claims Set is then | object constitutes the JWT Claims Set defined in JWT [RFC7519]. The | |||
| signed or signed and encrypted. | JWT Claims Set is then signed or signed and encrypted. | |||
| To sign, JSON Web Signature (JWS) [RFC7515] is used. The result is a | To sign, JSON Web Signature (JWS) [RFC7515] is used. The result is a | |||
| JWS signed JWT [RFC7519]. If signed, the Authorization Request | JWS-signed JWT [RFC7519]. If signed, the Authorization Request | |||
| Object SHOULD contain the Claims "iss" (issuer) and "aud" (audience) | Object SHOULD contain the Claims "iss" (issuer) and "aud" (audience) | |||
| as members, with their semantics being the same as defined in the JWT | as members with their semantics being the same as defined in the JWT | |||
| [RFC7519] specification. The value of "aud" should be the value of | [RFC7519] specification. The value of "aud" should be the value of | |||
| the Authorization Server (AS) "issuer" as defined in RFC8414 | the authorization server (AS) "issuer", as defined in RFC 8414 | |||
| [RFC8414]. | [RFC8414]. | |||
| To encrypt, JWE [RFC7516] is used. When both signature and | To encrypt, JWE [RFC7516] is used. When both signature and | |||
| encryption are being applied, the JWT MUST be signed then encrypted | encryption are being applied, the JWT MUST be signed, then encrypted, | |||
| as described in Section 11.2 of [RFC7519]. The result is a Nested | as described in Section 11.2 of [RFC7519]. The result is a Nested | |||
| JWT, as defined in [RFC7519]. | JWT, as defined in [RFC7519]. | |||
| The client determines the algorithms used to sign and encrypt Request | The client determines the algorithms used to sign and encrypt Request | |||
| Objects. The algorithms chosen need to be supported by both the | Objects. The algorithms chosen need to be supported by both the | |||
| client and the authorization server. The client can inform the | client and the authorization server. The client can inform the | |||
| authorization server of the algorithms that it supports in its | authorization server of the algorithms that it supports in its | |||
| dynamic client registration metadata [RFC7591], specifically, the | dynamic client registration metadata [RFC7591], specifically, the | |||
| metadata values "request_object_signing_alg", | metadata values "request_object_signing_alg", | |||
| "request_object_encryption_alg", and "request_object_encryption_enc". | "request_object_encryption_alg", and "request_object_encryption_enc". | |||
| Likewise, the authorization server can inform the client of the | Likewise, the authorization server can inform the client of the | |||
| algorithms that it supports in its authorization server metadata | algorithms that it supports in its authorization server metadata | |||
| [RFC8414], specifically, the metadata values | [RFC8414], specifically, the metadata values | |||
| "request_object_signing_alg_values_supported", | "request_object_signing_alg_values_supported", | |||
| "request_object_encryption_alg_values_supported", and | "request_object_encryption_alg_values_supported", and | |||
| "request_object_encryption_enc_values_supported". | "request_object_encryption_enc_values_supported". | |||
| The Request Object MAY be sent by value as described in Section 5.1 | The Request Object MAY be sent by value, as described in Section 5.1, | |||
| or by reference as described in Section 5.2. "request" and | or by reference, as described in Section 5.2. "request" and | |||
| "request_uri" parameters MUST NOT be included in Request Objects. | "request_uri" parameters MUST NOT be included in Request Objects. | |||
| A Request Object (Section 2.1) has the media type [RFC2046] | A Request Object (Section 2.1) has the media type [RFC2046] | |||
| "application/oauth-authz-req+jwt". Note that some existing | "application/oauth-authz-req+jwt". Note that some existing | |||
| deployments may alternatively be using the type "application/jwt". | deployments may alternatively be using the type "application/jwt". | |||
| The following is an example of the Claims in a Request Object before | The following is an example of the Claims in a Request Object before | |||
| base64url [RFC7515] encoding and signing. Note that it includes the | base64url [RFC7515] encoding and signing. Note that it includes the | |||
| extension parameters "nonce" and "max_age". | extension parameters "nonce" and "max_age". | |||
| skipping to change at page 9, line 5 ¶ | skipping to change at line 367 ¶ | |||
| lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns | lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns | |||
| aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC | aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC | |||
| JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q | JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q | |||
| IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK | IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK | |||
| b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | |||
| HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | |||
| JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | |||
| CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | |||
| pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | |||
| The following RSA public key, represented in JWK format, can be used | The following RSA public key, represented in JSON Web Key (JWK) | |||
| to validate the Request Object signature in this and subsequent | format, can be used to validate the Request Object signature in this | |||
| Request Object examples (with line wraps within values for display | and subsequent Request Object examples (with line wraps within values | |||
| purposes only): | for display purposes only): | |||
| { | { | |||
| "kty":"RSA", | "kty":"RSA", | |||
| "kid":"k2bdc", | "kid":"k2bdc", | |||
| "n":"x5RbkAZkmpRxia65qRQ1wwSMSxQUnS7gcpVTV_cdHmfmG2ltd2yabEO9XadD8 | "n":"x5RbkAZkmpRxia65qRQ1wwSMSxQUnS7gcpVTV_cdHmfmG2ltd2yabEO9XadD8 | |||
| pJNZubINPpmgHh3J1aD9WRwS05ucmFq3CfFsluLt13_7oX5yDRSKX7poXmT_5 | pJNZubINPpmgHh3J1aD9WRwS05ucmFq3CfFsluLt13_7oX5yDRSKX7poXmT_5 | |||
| ko8k4NJZPMAO8fPToDTH7kHYbONSE2FYa5GZ60CUsFhSonI-dcMDJ0Ary9lxI | ko8k4NJZPMAO8fPToDTH7kHYbONSE2FYa5GZ60CUsFhSonI-dcMDJ0Ary9lxI | |||
| w5k2z4TAdARVWcS7sD07VhlMMshrwsPHBQgTatlkxyIHXbYdtak8fqvNAwr7O | w5k2z4TAdARVWcS7sD07VhlMMshrwsPHBQgTatlkxyIHXbYdtak8fqvNAwr7O | |||
| lVEvM_Ipf5OfmdB8Sd-wjzaBsyP4VhJKoi_qdgSzpC694XZeYPq45Sw-q51iF | lVEvM_Ipf5OfmdB8Sd-wjzaBsyP4VhJKoi_qdgSzpC694XZeYPq45Sw-q51iF | |||
| UlcOlTCI7z6jltUtnR6ySn6XDGFnzH5Fe5ypw", | UlcOlTCI7z6jltUtnR6ySn6XDGFnzH5Fe5ypw", | |||
| skipping to change at page 9, line 31 ¶ | skipping to change at line 393 ¶ | |||
| 5. Authorization Request | 5. Authorization Request | |||
| The client constructs the authorization request URI by adding the | The client constructs the authorization request URI by adding the | |||
| following parameters to the query component of the authorization | following parameters to the query component of the authorization | |||
| endpoint URI using the "application/x-www-form-urlencoded" format: | endpoint URI using the "application/x-www-form-urlencoded" format: | |||
| request | request | |||
| REQUIRED unless "request_uri" is specified. The Request Object | REQUIRED unless "request_uri" is specified. The Request Object | |||
| (Section 2.1) that holds authorization request parameters stated | (Section 2.1) that holds authorization request parameters stated | |||
| in section 4 of OAuth 2.0 [RFC6749]. If this parameter is present | in Section 4 of [RFC6749] (OAuth 2.0). If this parameter is | |||
| in the authorization request, "request_uri" MUST NOT be present. | present in the authorization request, "request_uri" MUST NOT be | |||
| present. | ||||
| request_uri | request_uri | |||
| REQUIRED unless "request" is specified. The absolute URI as | REQUIRED unless "request" is specified. The absolute URI, as | |||
| defined by RFC3986 [RFC3986] that is the Request Object URI | defined by RFC 3986 [RFC3986], that is the Request Object URI | |||
| (Section 2.2) referencing the authorization request parameters | (Section 2.2) referencing the authorization request parameters | |||
| stated in section 4 of OAuth 2.0 [RFC6749]. If this parameter is | stated in Section 4 of [RFC6749] (OAuth 2.0). If this parameter | |||
| present in the authorization request, "request" MUST NOT be | is present in the authorization request, "request" MUST NOT be | |||
| present. | present. | |||
| client_id | client_id | |||
| REQUIRED. OAuth 2.0 [RFC6749] "client_id". The value MUST match | REQUIRED. OAuth 2.0 [RFC6749] "client_id". The value MUST match | |||
| the "request" or "request_uri" Request Object's (Section 2.1) | the "request" or "request_uri" Request Object's (Section 2.1) | |||
| "client_id". | "client_id". | |||
| The client directs the resource owner to the constructed URI using an | The client directs the resource owner to the constructed URI using an | |||
| HTTP redirection response, or by other means available to it via the | HTTP redirection response or by other means available to it via the | |||
| user-agent. | user agent. | |||
| For example, the client directs the end user's user-agent to make the | For example, the client directs the end user's user agent to make the | |||
| following HTTPS request: | following HTTPS request: | |||
| GET /authz?client_id=s6BhdRkqt3&request=eyJhbG..AlMGzw HTTP/1.1 | GET /authz?client_id=s6BhdRkqt3&request=eyJhbG..AlMGzw HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| The value for the request parameter is abbreviated for brevity. | The value for the request parameter is abbreviated for brevity. | |||
| The authorization request object MUST be one of the following: | The Authorization Request Object MUST be one of the following: | |||
| (a) JWS signed | (a) JWS signed | |||
| (b) JWS signed and JWE encrypted | (b) JWS signed and JWE encrypted | |||
| The client MAY send the parameters included in the request object | The client MAY send the parameters included in the Request Object | |||
| duplicated in the query parameters as well for the backward | duplicated in the query parameters as well for backward | |||
| compatibility etc. However, the authorization server supporting this | compatibility, etc. However, the authorization server supporting | |||
| specification MUST only use the parameters included in the request | this specification MUST only use the parameters included in the | |||
| object. | Request Object. | |||
| 5.1. Passing a Request Object by Value | 5.1. Passing a Request Object by Value | |||
| The Client sends the Authorization Request as a Request Object to the | The client sends the authorization request as a Request Object to the | |||
| Authorization Endpoint as the "request" parameter value. | authorization endpoint as the "request" parameter value. | |||
| The following is an example of an Authorization Request using the | The following is an example of an authorization request using the | |||
| "request" parameter (with line wraps within values for display | "request" parameter (with line wraps within values for display | |||
| purposes only): | purposes only): | |||
| https://server.example.com/authorize?client_id=s6BhdRkqt3& | https://server.example.com/authorize?client_id=s6BhdRkqt3& | |||
| request=eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6 | request=eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6 | |||
| ICJzNkJoZFJrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBs | ICJzNkJoZFJrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBs | |||
| ZS5jb20iLAogICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAg | ZS5jb20iLAogICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAg | |||
| ICAiY2xpZW50X2lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6 | ICAiY2xpZW50X2lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6 | |||
| ICJodHRwczovL2NsaWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAi | ICJodHRwczovL2NsaWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAi | |||
| b3BlbmlkIiwKICAgICJzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2Ui | b3BlbmlkIiwKICAgICJzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2Ui | |||
| OiAibi0wUzZfV3pBMk1qIiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VU | OiAibi0wUzZfV3pBMk1qIiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VU | |||
| ElVaPjqW_ToI1yrEJ67BgKb5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC | ElVaPjqW_ToI1yrEJ67BgKb5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC | |||
| 0iQJwXu5YVY-vnW0_PLJb1C2HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKz | 0iQJwXu5YVY-vnW0_PLJb1C2HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKz | |||
| uKzqSb1wAZALo5f89B_p6QA6j6JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3E | uKzqSb1wAZALo5f89B_p6QA6j6JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3E | |||
| YLYaCb4ik4I1zGXE4fvim9FIMs8OCMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W | YLYaCb4ik4I1zGXE4fvim9FIMs8OCMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W | |||
| 9typPf846lGwA8h9G9oNTIuX8Ft2jfpnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3 | 9typPf846lGwA8h9G9oNTIuX8Ft2jfpnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3 | |||
| j1i7tLR_5Nz-g | j1i7tLR_5Nz-g | |||
| 5.2. Passing a Request Object by Reference | 5.2. Passing a Request Object by Reference | |||
| The "request_uri" Authorization Request parameter enables OAuth | The "request_uri" authorization request parameter enables OAuth | |||
| authorization requests to be passed by reference, rather than by | authorization requests to be passed by reference rather than by | |||
| value. This parameter is used identically to the "request" | value. This parameter is used identically to the "request" | |||
| parameter, other than that the Request Object value is retrieved from | parameter, except that the Request Object value is retrieved from the | |||
| the resource identified by the specified URI rather than passed by | resource identified by the specified URI rather than passed by value. | |||
| value. | ||||
| The entire Request URI SHOULD NOT exceed 512 ASCII characters. There | The entire Request URI SHOULD NOT exceed 512 ASCII characters. There | |||
| are two reasons for this restriction: | are two reasons for this restriction: | |||
| 1. Many phones in the market as of this writing still do not accept | 1. Many phones on the market as of this writing still do not accept | |||
| large payloads. The restriction is typically either 512 or 1024 | large payloads. The restriction is typically either 512 or 1024 | |||
| ASCII characters. | ASCII characters. | |||
| 2. On a slow connection such as 2G mobile connection, a large URL | 2. On a slow connection such as a 2G mobile connection, a large URL | |||
| would cause the slow response and therefore the use of such is | would cause a slow response; therefore, the use of such is not | |||
| not advisable from the user experience point of view. | advisable from the user-experience point of view. | |||
| The contents of the resource referenced by the "request_uri" MUST be | The contents of the resource referenced by the "request_uri" MUST be | |||
| a Request Object and MUST be reachable by the Authorization Server | a Request Object and MUST be reachable by the authorization server | |||
| unless the URI was provided to the client by the Authorization | unless the URI was provided to the client by the authorization | |||
| Server. In the first case, the "request_uri" MUST be an "https" URI, | server. In the first case, the "request_uri" MUST be an "https" URI, | |||
| as specified in Section 2.7.2 of RFC7230 [RFC7230]. In the second | as specified in Section 2.7.2 of [RFC7230]. In the second case, it | |||
| case, it MUST be a URN, as specified in RFC8141 [RFC8141]. | MUST be a URN, as specified in [RFC8141]. | |||
| The following is an example of the contents of a Request Object | The following is an example of the contents of a Request Object | |||
| resource that can be referenced by a "request_uri" (with line wraps | resource that can be referenced by a "request_uri" (with line wraps | |||
| within values for display purposes only): | within values for display purposes only): | |||
| eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF | eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF | |||
| JrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLAog | JrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLAog | |||
| ICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAgICAiY2xpZW50X2 | ICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAgICAiY2xpZW50X2 | |||
| lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns | lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns | |||
| aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC | aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC | |||
| JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q | JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q | |||
| IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK | IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK | |||
| b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | |||
| HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | |||
| JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | |||
| CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | |||
| pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | |||
| 5.2.1. URI Referencing the Request Object | 5.2.1. URI Referencing the Request Object | |||
| The Client stores the Request Object resource either locally or | The client stores the Request Object resource either locally or | |||
| remotely at a URI the Authorization Server can access. Such facility | remotely at a URI the authorization server can access. Such a | |||
| may be provided by the authorization server or a trusted third party. | facility may be provided by the authorization server or a trusted | |||
| For example, the authorization server may provide a URL to which the | third party. For example, the authorization server may provide a URL | |||
| client POSTs the request object and obtains the Request URI. This | to which the client POSTs the Request Object and obtains the Request | |||
| URI is the Request Object URI, "request_uri". | URI. This URI is the Request Object URI, "request_uri". | |||
| It is possible for the Request Object to include values that are to | It is possible for the Request Object to include values that are to | |||
| be revealed only to the Authorization Server. As such, the | be revealed only to the authorization server. As such, the | |||
| "request_uri" MUST have appropriate entropy for its lifetime so that | "request_uri" MUST have appropriate entropy for its lifetime so that | |||
| the URI is not guessable if publicly retrievable. For the guidance, | the URI is not guessable if publicly retrievable. For the guidance, | |||
| refer to 5.1.4.2.2 of [RFC6819] and Good Practices for Capability | refer to Section 5.1.4.2.2 of [RFC6819] and "Good Practices for | |||
| URLs [CapURLs]. It is RECOMMENDED that it be removed after a | Capability URLs" [CapURLs]. It is RECOMMENDED that the "request_uri" | |||
| reasonable timeout unless access control measures are taken. | be removed after a reasonable timeout unless access control measures | |||
| are taken. | ||||
| The following is an example of a Request Object URI value (with line | The following is an example of a Request Object URI value (with line | |||
| wraps within values for display purposes only). In this example, a | wraps within values for display purposes only). In this example, a | |||
| trusted third-party service hosts the Request Object. | trusted third-party service hosts the Request Object. | |||
| https://tfp.example.org/request.jwt/ | https://tfp.example.org/request.jwt/ | |||
| GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM | GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM | |||
| 5.2.2. Request using the "request_uri" Request Parameter | 5.2.2. Request Using the "request_uri" Request Parameter | |||
| The Client sends the Authorization Request to the Authorization | The client sends the authorization request to the authorization | |||
| Endpoint. | endpoint. | |||
| The following is an example of an Authorization Request using the | The following is an example of an authorization request using the | |||
| "request_uri" parameter (with line wraps within values for display | "request_uri" parameter (with line wraps within values for display | |||
| purposes only): | purposes only): | |||
| https://server.example.com/authorize? | https://server.example.com/authorize? | |||
| client_id=s6BhdRkqt3 | client_id=s6BhdRkqt3 | |||
| &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt | &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt | |||
| %2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM | %2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM | |||
| 5.2.3. Authorization Server Fetches Request Object | 5.2.3. Authorization Server Fetches Request Object | |||
| Upon receipt of the Request, the Authorization Server MUST send an | Upon receipt of the Request, the authorization server MUST send an | |||
| HTTP "GET" request to the "request_uri" to retrieve the referenced | HTTP "GET" request to the "request_uri" to retrieve the referenced | |||
| Request Object, unless it is stored in a way so that it can retrieve | Request Object unless the Request Object is stored in a way so that | |||
| it through other mechanism securely, and parse it to recreate the | the server can retrieve it through other mechanisms securely and | |||
| Authorization Request parameters. | parse it to recreate the authorization request parameters. | |||
| The following is an example of this fetch process. In this example, | The following is an example of this fetch process. In this example, | |||
| a trusted third-party service hosts the Request Object. | a trusted third-party service hosts the Request Object. | |||
| GET /request.jwt/GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM HTTP/1.1 | GET /request.jwt/GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM HTTP/1.1 | |||
| Host: tfp.example.org | Host: tfp.example.org | |||
| The following is an example of the fetch response: | The following is an example of the fetch response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Date: Thu, 20 Aug 2020 23:52:39 GMT | Date: Thu, 20 Aug 2020 23:52:39 GMT | |||
| Server: Apache/2.4.43 (tfp.example.org) | Server: Apache/2.4.43 (tfp.example.org) | |||
| Content-type: application/oauth-authz-req+jwt | Content-type: application/oauth-authz-req+jwt | |||
| Content-Length: 797 | Content-Length: 797 | |||
| Last-Modified: Wed, 19 Aug 2020 23:52:32 GMT | Last-Modified: Wed, 19 Aug 2020 23:52:32 GMT | |||
| eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF | eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF | |||
| skipping to change at page 13, line 30 ¶ | skipping to change at line 580 ¶ | |||
| b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 | |||
| HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 | |||
| JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O | |||
| CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf | |||
| pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g | |||
| 6. Validating JWT-Based Requests | 6. Validating JWT-Based Requests | |||
| 6.1. JWE Encrypted Request Object | 6.1. JWE Encrypted Request Object | |||
| If the request object is encrypted, the Authorization Server MUST | If the Request Object is encrypted, the authorization server MUST | |||
| decrypt the JWT in accordance with the JSON Web Encryption [RFC7516] | decrypt the JWT in accordance with the JSON Web Encryption [RFC7516] | |||
| specification. | specification. | |||
| The result is a signed request object. | The result is a signed Request Object. | |||
| If decryption fails, the Authorization Server MUST return an | If decryption fails, the authorization server MUST return an | |||
| "invalid_request_object" error to the client in response to the | "invalid_request_object" error to the client in response to the | |||
| authorization request. | authorization request. | |||
| 6.2. JWS Signed Request Object | 6.2. JWS-Signed Request Object | |||
| The Authorization Server MUST validate the signature of the JSON Web | The authorization server MUST validate the signature of the JWS- | |||
| Signature [RFC7515] signed Request Object. If a "kid" Header | signed [RFC7515] Request Object. If a "kid" Header Parameter is | |||
| Parameter is present, the key identified MUST be the key used, and | present, the key identified MUST be the key used and MUST be a key | |||
| MUST be a key associated with the client. The signature MUST be | associated with the client. The signature MUST be validated using a | |||
| validated using a key associated with the client and the algorithm | key associated with the client and the algorithm specified in the | |||
| specified in the "alg" Header Parameter. Algorithm verification MUST | "alg" Header Parameter. Algorithm verification MUST be performed, as | |||
| be performed, as specified in Sections 3.1 and 3.2 of [RFC8725]. | specified in Sections 3.1 and 3.2 of [RFC8725]. | |||
| If the key is not associated with the client or if signature | If the key is not associated with the client or if signature | |||
| validation fails, the Authorization Server MUST return an | validation fails, the authorization server MUST return an | |||
| "invalid_request_object" error to the client in response to the | "invalid_request_object" error to the client in response to the | |||
| authorization request. | authorization request. | |||
| 6.3. Request Parameter Assembly and Validation | 6.3. Request Parameter Assembly and Validation | |||
| The Authorization Server MUST extract the set of Authorization | The authorization server MUST extract the set of authorization | |||
| Request parameters from the Request Object value. The Authorization | request parameters from the Request Object value. The authorization | |||
| Server MUST only use the parameters in the Request Object even if the | server MUST only use the parameters in the Request Object, even if | |||
| same parameter is provided in the query parameter. The Client ID | the same parameter is provided in the query parameter. The client ID | |||
| values in the "client_id" request parameter and in the Request Object | values in the "client_id" request parameter and in the Request Object | |||
| "client_id" claim MUST be identical. The Authorization Server then | "client_id" claim MUST be identical. The authorization server then | |||
| validates the request as specified in OAuth 2.0 [RFC6749]. | validates the request, as specified in OAuth 2.0 [RFC6749]. | |||
| If the Client ID check or the request validation fails, then the | If the Client ID check or the request validation fails, then the | |||
| Authorization Server MUST return an error to the client in response | authorization server MUST return an error to the client in response | |||
| to the authorization request, as specified in Section 5.2 of OAuth | to the authorization request, as specified in Section 5.2 of | |||
| 2.0 [RFC6749]. | [RFC6749] (OAuth 2.0). | |||
| 7. Authorization Server Response | 7. Authorization Server Response | |||
| Authorization Server Response is created and sent to the client as in | The authorization server response is created and sent to the client | |||
| Section 4 of OAuth 2.0 [RFC6749]. | as in Section 4 of [RFC6749] (OAuth 2.0). | |||
| In addition, this document uses these additional error values: | In addition, this document uses these additional error values: | |||
| invalid_request_uri | invalid_request_uri | |||
| The "request_uri" in the Authorization Request returns an error or | The "request_uri" in the authorization request returns an error or | |||
| contains invalid data. | contains invalid data. | |||
| invalid_request_object | invalid_request_object | |||
| The request parameter contains an invalid Request Object. | The request parameter contains an invalid Request Object. | |||
| request_not_supported | request_not_supported | |||
| The Authorization Server does not support the use of the "request" | The authorization server does not support the use of the "request" | |||
| parameter. | parameter. | |||
| request_uri_not_supported | request_uri_not_supported | |||
| The Authorization Server does not support the use of the | The authorization server does not support the use of the | |||
| "request_uri" parameter. | "request_uri" parameter. | |||
| 8. TLS Requirements | 8. TLS Requirements | |||
| Client implementations supporting the Request Object URI method MUST | Client implementations supporting the Request Object URI method MUST | |||
| support TLS following Recommendations for Secure Use of Transport | support TLS, following "Recommendations for Secure Use of Transport | |||
| Layer Security (TLS) and Datagram Transport Layer Security (DTLS) | Layer Security (TLS) and Datagram Transport Layer Security (DTLS)" | |||
| [BCP195]. | [RFC7525]. | |||
| To protect against information disclosure and tampering, | To protect against information disclosure and tampering, | |||
| confidentiality protection MUST be applied using TLS with a cipher | confidentiality protection MUST be applied using TLS with a cipher | |||
| suite that provides confidentiality and integrity protection. | suite that provides confidentiality and integrity protection. | |||
| HTTP clients MUST also verify the TLS server certificate, using DNS- | HTTP clients MUST also verify the TLS server certificate, using DNS- | |||
| ID [RFC6125], to avoid man-in-the-middle attacks. The rules and | ID [RFC6125], to avoid man-in-the-middle attacks. The rules and | |||
| guidelines defined in [RFC6125] apply here, with the following | guidelines defined in [RFC6125] apply here, with the following | |||
| considerations: | considerations: | |||
| o Support for DNS-ID identifier type (that is, the dNSName identity | * Support for DNS-ID identifier type (that is, the dNSName identity | |||
| in the subjectAltName extension) is REQUIRED. Certification | in the subjectAltName extension) is REQUIRED. Certification | |||
| authorities which issue server certificates MUST support the DNS- | authorities that issue server certificates MUST support the DNS-ID | |||
| ID identifier type, and the DNS-ID identifier type MUST be present | identifier type, and the DNS-ID identifier type MUST be present in | |||
| in server certificates. | server certificates. | |||
| o DNS names in server certificates MAY contain the wildcard | * DNS names in server certificates MAY contain the wildcard | |||
| character "*". | character "*". | |||
| o Clients MUST NOT use CN-ID identifiers; a CN field may be present | * Clients MUST NOT use CN-ID identifiers; a Common Name field (CN | |||
| in the server certificate's subject name, but MUST NOT be used for | field) may be present in the server certificate's subject name but | |||
| authentication within the rules described in [BCP195]. | MUST NOT be used for authentication within the rules described in | |||
| [RFC7525]. | ||||
| o SRV-ID and URI-ID as described in Section 6.5 of [RFC6125] MUST | * SRV-ID and URI-ID as described in Section 6.5 of [RFC6125] MUST | |||
| NOT be used for comparison. | NOT be used for comparison. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| 9.1. OAuth Parameters Registration | 9.1. OAuth Parameters Registration | |||
| Since the request object is a JWT, the core JWT claims cannot be used | Since the Request Object is a JWT, the core JWT claims cannot be used | |||
| for any purpose in the request object other than for what JWT | for any purpose in the Request Object other than for what JWT | |||
| dictates. Thus, they need to be registered as OAuth Authorization | dictates. Thus, they have been registered as OAuth authorization | |||
| Request parameters to avoid future OAuth extensions using them with | request parameters to avoid future OAuth extensions using them with | |||
| different meanings. | different meanings. | |||
| This specification adds the following values to the "OAuth | This specification adds the following values to the "OAuth | |||
| Parameters" registry [IANA.OAuth.Parameters] established by | Parameters" registry [IANA.OAuth.Parameters] established by | |||
| [RFC6749]. | [RFC6749]. | |||
| o Name: "iss" | Name: "iss" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.1 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.1 of | |||
| document. | [RFC7519]. | |||
| o Name: "sub" | Name: "sub" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.2 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.2 of | |||
| document. | [RFC7519]. | |||
| o Name: "aud" | Name: "aud" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.3 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.3 of | |||
| document. | [RFC7519]. | |||
| o Name: "exp" | Name: "exp" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.4 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.4 of | |||
| document. | [RFC7519]. | |||
| o Name: "nbf" | Name: "nbf" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.5 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.5 of | |||
| document. | [RFC7519]. | |||
| o Name: "iat" | Name: "iat" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.6 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.6 of | |||
| document. | [RFC7519]. | |||
| o Name: "jti" | Name: "jti" | |||
| o Parameter Usage Location: authorization request | Parameter Usage Location: authorization request | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 4.1.7 of [RFC7519] and this | Specification Document(s): This document and Section 4.1.7 of | |||
| document. | [RFC7519]. | |||
| 9.2. OAuth Authorization Server Metadata Registry | 9.2. OAuth Authorization Server Metadata Registry | |||
| This specification adds the following value to the "OAuth | This specification adds the following value to the "OAuth | |||
| Authorization Server Metadata" registry [IANA.OAuth.Parameters] | Authorization Server Metadata" registry [IANA.OAuth.Parameters] | |||
| established by [RFC8414]. | established by [RFC8414]. | |||
| o Metadata Name: "require_signed_request_object" | Metadata Name: "require_signed_request_object" | |||
| o Metadata Description: Indicates where authorization request needs | Metadata Description: Indicates where authorization request needs to | |||
| to be protected as Request Object and provided through either | be protected as Request Object and provided through either | |||
| "request" or "request_uri parameter". | "request" or "request_uri parameter". | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 10.5 of this document. | Specification Document(s): Section 10.5 of this document. | |||
| 9.3. OAuth Dynamic Client Registration Metadata Registry | 9.3. OAuth Dynamic Client Registration Metadata Registry | |||
| This specification adds the following value to the "OAuth Dynamic | This specification adds the following value to the "OAuth Dynamic | |||
| Client Registration Metadata" registry [IANA.OAuth.Parameters] | Client Registration Metadata" registry [IANA.OAuth.Parameters] | |||
| established by [RFC7591]. | established by [RFC7591]. | |||
| o Metadata Name: "require_signed_request_object" | Metadata Name: "require_signed_request_object" | |||
| o Metadata Description: Indicates where authorization request needs | Metadata Description: Indicates where authorization request needs to | |||
| to be protected as Request Object and provided through either | be protected as Request Object and provided through either | |||
| "request" or "request_uri parameter". | "request" or "request_uri parameter". | |||
| o Change Controller: IETF | Change Controller: IETF | |||
| o Specification Document(s): Section 10.5 of this document. | Specification Document(s): Section 10.5 of this document. | |||
| 9.4. Media Type Registration | 9.4. Media Type Registration | |||
| 9.4.1. Registry Contents | 9.4.1. Registry Contents | |||
| This section registers the "application/oauth-authz-req+jwt" media | This section registers the "application/oauth-authz-req+jwt" media | |||
| type [RFC2046] in the "Media Types" registry [IANA.MediaTypes] in the | type [RFC2046] in the "Media Types" registry [IANA.MediaTypes] in the | |||
| manner described in [RFC6838], which can be used to indicate that the | manner described in [RFC6838]. It can be used to indicate that the | |||
| content is a JWT containing Request Object claims. | content is a JWT containing Request Object claims. | |||
| o Type name: application | Type name: application | |||
| o Subtype name: oauth-authz-req+jwt | Subtype name: oauth-authz-req+jwt | |||
| o Required parameters: n/a | Required parameters: N/A | |||
| o Optional parameters: n/a | Optional parameters: N/A | |||
| o Encoding considerations: binary; A Request Object is a JWT; JWT | Encoding considerations: binary; a Request Object is a JWT; JWT | |||
| values are encoded as a series of base64url-encoded values (some | values are encoded as a series of base64url-encoded values (some | |||
| of which may be the empty string) separated by period ('.') | of which may be the empty string) separated by period (".") | |||
| characters. | characters. | |||
| o Security considerations: See Section 10 of [[ this specification | Security considerations: See Section 10 of RFC 9101 | |||
| ]] | Interoperability considerations: N/A | |||
| o Interoperability considerations: n/a | Published specification: Section 4 of RFC 9101 | |||
| o Published specification: Section 4 of [[ this specification ]] | Applications that use this media type: Applications that use Request | |||
| o Applications that use this media type: Applications that use | Objects to make an OAuth 2.0 authorization request | |||
| Request Objects to make an OAuth 2.0 Authorization Request | Fragment identifier considerations: N/A | |||
| o Fragment identifier considerations: n/a | Additional information: | |||
| o Additional information: | Deprecated alias names for this type: N/A | |||
| Magic number(s): N/A | ||||
| Magic number(s): n/a | File extension(s): N/A | |||
| File extension(s): n/a | Macintosh file type code(s): N/A | |||
| Macintosh file type code(s): n/a | Person & email address to contact for further information: | |||
| Nat Sakimura <nat@nat.consulting> | ||||
| o Person & email address to contact for further information: | Intended usage: COMMON | |||
| Nat Sakimura, nat@nat.consulting | Restrictions on usage: none | |||
| o Intended usage: COMMON | Author: Nat Sakimura <nat@nat.consulting> | |||
| o Restrictions on usage: none | Change controller: IETF | |||
| o Author: Nat Sakimura, nat@nat.consulting | Provisional registration? No | |||
| o Change controller: IETF | ||||
| o Provisional registration? No | ||||
| 10. Security Considerations | 10. Security Considerations | |||
| In addition to the all the security considerations discussed in OAuth | In addition to all the security considerations discussed in OAuth 2.0 | |||
| 2.0 [RFC6819], the security considerations in [RFC7515], [RFC7516], | [RFC6819], the security considerations in [RFC7515], [RFC7516], | |||
| [RFC7518], and [RFC8725] need to be considered. Also, there are | [RFC7518], and [RFC8725] need to be considered. Also, there are | |||
| several academic papers such as [BASIN] that provide useful insight | several academic papers such as [BASIN] that provide useful insight | |||
| into the security properties of protocols like OAuth. | into the security properties of protocols like OAuth. | |||
| In consideration of the above, this document advises taking the | In consideration of the above, this document advises taking the | |||
| following security considerations into account. | following security considerations into account. | |||
| 10.1. Choice of Algorithms | 10.1. Choice of Algorithms | |||
| When sending the authorization request object through "request" | When sending the Authorization Request Object through the "request" | |||
| parameter, it MUST either be signed using JWS [RFC7515] or signed | parameter, it MUST be either signed using JWS [RFC7515] or signed and | |||
| then encrypted using JWS [RFC7515] and JWE [RFC7516] respectively, | then encrypted using JWS [RFC7515] and JWE [RFC7516], respectively, | |||
| with then considered appropriate algorithms. | with algorithms considered appropriate at the time. | |||
| 10.2. Request Source Authentication | 10.2. Request Source Authentication | |||
| The source of the Authorization Request MUST always be verified. | The source of the authorization request MUST always be verified. | |||
| There are several ways to do it: | There are several ways to do it: | |||
| (a) Verifying the JWS Signature of the Request Object. | (a) Verifying the JWS Signature of the Request Object. | |||
| (b) Verifying that the symmetric key for the JWE encryption is the | (b) Verifying that the symmetric key for the JWE encryption is the | |||
| correct one if the JWE is using symmetric encryption. Note | correct one if the JWE is using symmetric encryption. Note, | |||
| however, that if public key encryption is used, no source | however, that if public key encryption is used, no source | |||
| authentication is enabled by the encryption, as any party can | authentication is enabled by the encryption, as any party can | |||
| encrypt content to the public key. | encrypt to the public key. | |||
| (c) Verifying the TLS Server Identity of the Request Object URI. In | (c) Verifying the TLS Server Identity of the Request Object URI. In | |||
| this case, the Authorization Server MUST know out-of-band that | this case, the authorization server MUST know out-of-band that | |||
| the Client uses Request Object URI and only the Client is | the client uses the Request Object URI and only the client is | |||
| covered by the TLS certificate. In general, it is not a | covered by the TLS certificate. In general, this is not a | |||
| reliable method. | reliable method. | |||
| (d) When an Authorization Server implements a service that returns a | (d) When an authorization server implements a service that returns a | |||
| Request Object URI in exchange for a Request Object, the | Request Object URI in exchange for a Request Object, the | |||
| Authorization Server MUST perform Client Authentication to | authorization server MUST perform client authentication to | |||
| accept the Request Object and bind the Client Identifier to the | accept the Request Object and bind the client identifier to the | |||
| Request Object URI it is providing. It MUST validate the | Request Object URI it is providing. It MUST validate the | |||
| signature, per (a). Since Request Object URI can be replayed, | signature, per (a). Since the Request Object URI can be | |||
| the lifetime of the Request Object URI MUST be short and | replayed, the lifetime of the Request Object URI MUST be short | |||
| preferably one-time use. The entropy of the Request Object URI | and preferably one-time use. The entropy of the Request Object | |||
| MUST be sufficiently large. The adequate shortness of the | URI MUST be sufficiently large. The adequate shortness of the | |||
| validity and the entropy of the Request Object URI depends on | validity and the entropy of the Request Object URI depends on | |||
| the risk calculation based on the value of the resource being | the risk calculation based on the value of the resource being | |||
| protected. A general guidance for the validity time would be | protected. A general guidance for the validity time would be | |||
| less than a minute and the Request Object URI is to include a | less than a minute, and the Request Object URI is to include a | |||
| cryptographic random value of 128bit or more at the time of the | cryptographic random value of 128 bits or more at the time of | |||
| writing of this specification. | the writing of this specification. | |||
| (e) When a trusted third-party service returns a Request Object URI | (e) When a trusted third-party service returns a Request Object URI | |||
| in exchange for a Request Object, it MUST validate the | in exchange for a Request Object, it MUST validate the | |||
| signature, per (a). In addition, the Authorization Server MUST | signature, per (a). In addition, the authorization server MUST | |||
| be trusted by the third-party service and MUST know out-of-band | be trusted by the third-party service and MUST know out-of-band | |||
| that the client is also trusted by it. | that the client is also trusted by it. | |||
| 10.3. Explicit Endpoints | 10.3. Explicit Endpoints | |||
| Although this specification does not require them, research such as | Although this specification does not require them, research such as | |||
| [BASIN] points out that it is a good practice to explicitly state the | [BASIN] points out that it is a good practice to explicitly state the | |||
| intended interaction endpoints and the message position in the | intended interaction endpoints and the message position in the | |||
| sequence in a tamper evident manner so that the intent of the | sequence in a tamper-evident manner so that the intent of the | |||
| initiator is unambiguous. The following endpoints defined in | initiator is unambiguous. It is RECOMMENDED by this specification to | |||
| [RFC6749], [RFC6750], and [RFC8414] are RECOMMENDED by this | use this practice for the following endpoints defined in [RFC6749], | |||
| specification to use this practice : | [RFC6750], and [RFC8414]: | |||
| (a) Protected Resources ("protected_resources") | (a) Protected resources ("protected_resources") | |||
| (b) Authorization Endpoint ("authorization_endpoint") | (b) Authorization endpoint ("authorization_endpoint") | |||
| (c) Redirection URI ("redirect_uri") | (c) Redirection URI ("redirect_uri") | |||
| (d) Token Endpoint ("token_endpoint") | (d) Token endpoint ("token_endpoint") | |||
| Further, if dynamic discovery is used, then this practice also | Further, if dynamic discovery is used, then this practice also | |||
| applies to the discovery related endpoints. | applies to the discovery-related endpoints. | |||
| In [RFC6749], while Redirection URI is included in the Authorization | In [RFC6749], while the redirection URI is included in the | |||
| Request, others are not. As a result, the same applies to | authorization request, others are not. As a result, the same applies | |||
| Authorization Request Object. | to the Authorization Request Object. | |||
| 10.4. Risks Associated with request_uri | 10.4. Risks Associated with request_uri | |||
| The introduction of "request_uri" introduces several attack | The introduction of "request_uri" introduces several attack | |||
| possibilities. Consult the security considerations in Section 7 of | possibilities. Consult the security considerations in Section 7 of | |||
| RFC3986 [RFC3986] for more information regarding risks associated | [RFC3986] for more information regarding risks associated with URIs. | |||
| with URIs. | ||||
| 10.4.1. DDoS Attack on the Authorization Server | 10.4.1. DDoS Attack on the Authorization Server | |||
| A set of malicious client can launch a DoS attack to the | A set of malicious clients can launch a DoS attack to the | |||
| authorization server by pointing the "request_uri" to a URI that | authorization server by pointing the "request_uri" to a URI that | |||
| returns extremely large content or extremely slow to respond. Under | returns extremely large content or is extremely slow to respond. | |||
| such an attack, the server may use up its resource and start failing. | Under such an attack, the server may use up its resource and start | |||
| failing. | ||||
| Similarly, a malicious client can specify the "request_uri" value | Similarly, a malicious client can specify a "request_uri" value that | |||
| that itself points to an authorization request URI that uses | itself points to an authorization request URI that uses "request_uri" | |||
| "request_uri" to cause the recursive lookup. | to cause the recursive lookup. | |||
| To prevent such attack to succeed, the server should (a) check that | To prevent such an attack from succeeding, the server should a) check | |||
| the value of "request_uri" parameter does not point to an unexpected | that the value of the "request_uri" parameter does not point to an | |||
| location, (b) check the media type of the response is "application/ | unexpected location, b) check that the media type of the response is | |||
| oauth-authz-req+jwt", (c) implement a time-out for obtaining the | "application/oauth-authz-req+jwt", c) implement a timeout for | |||
| content of "request_uri", and (d) not perform recursive GET on the | obtaining the content of "request_uri", and d) not perform recursive | |||
| "request_uri". | GET on the "request_uri". | |||
| 10.4.2. Request URI Rewrite | 10.4.2. Request URI Rewrite | |||
| The value of "request_uri" is not signed thus it can be tampered by | The value of "request_uri" is not signed; thus, it can be tampered | |||
| Man-in-the-browser attacker. Several attack possibilities rise | with by a man-in-the-browser attacker. Several attack possibilities | |||
| because of this, e.g., (a) attacker may create another file that the | arise because of this. For example, a) an attacker may create | |||
| rewritten URI points to making it possible to request extra scope (b) | another file that the rewritten URI points to, making it possible to | |||
| attacker launches a DoS attack to a victim site by setting the value | request extra scope, or b) an attacker may launch a DoS attack on a | |||
| of "request_uri" to be that of the victim. | victim site by setting the value of "request_uri" to be that of the | |||
| victim. | ||||
| To prevent such attack to succeed, the server should (a) check that | To prevent such an attack from succeeding, the server should a) check | |||
| the value of "request_uri" parameter does not point to an unexpected | that the value of the "request_uri" parameter does not point to an | |||
| location, (b) check the media type of the response is "application/ | unexpected location, b) check that the media type of the response is | |||
| oauth-authz-req+jwt", and (c) implement a time-out for obtaining the | "application/oauth-authz-req+jwt", and c) implement a timeout for | |||
| content of "request_uri". | obtaining the content of "request_uri". | |||
| 10.5. Downgrade Attack | 10.5. Downgrade Attack | |||
| Unless the protocol used by client and the server is locked down to | Unless the protocol used by the client and the server is locked down | |||
| use OAuth JAR, it is possible for an attacker to use RFC6749 requests | to use an OAuth JWT-Secured Authorization Request (JAR), it is | |||
| to bypass all the protection provided by this specification. | possible for an attacker to use RFC 6749 requests to bypass all the | |||
| protection provided by this specification. | ||||
| To prevent it, this specification defines a new client metadata and | To prevent this kind of attack, this specification defines new client | |||
| server metadata "require_signed_request_object" whose value is a | metadata and server metadata values, both named | |||
| boolean. | "require_signed_request_object", whose values are both booleans. | |||
| When the value of it as a client metadata is "true", then the server | When the value of it as client metadata is "true", then the server | |||
| MUST reject the authorization request from the client that does not | MUST reject the authorization request from the client that does not | |||
| conform to this specification. It MUST also reject the request if | conform to this specification. It MUST also reject the request if | |||
| the request object uses "alg":"none" when this client metadata value | the Request Object uses an "alg" value of "none" when this server | |||
| is "true". If omitted, the default value is "false". | metadata value is "true". If omitted, the default value is "false". | |||
| When the value of it as a server metadata is "true", then the server | When the value of it as server metadata is "true", then the server | |||
| MUST reject the authorization request from any client that does not | MUST reject the authorization request from any client that does not | |||
| conform to this specification. It MUST also reject the request if | conform to this specification. It MUST also reject the request if | |||
| the request object uses "alg":"none" when this server metadata value | the Request Object uses an "alg" value of "none". If omitted, the | |||
| is "true". If omitted, the default value is "false". | default value is "false". | |||
| Note that even if "require_signed_request_object" metadata values are | Note that even if "require_signed_request_object" metadata values are | |||
| not present, the client MAY use signed request objects, provided that | not present, the client MAY use signed Request Objects, provided that | |||
| there are signing algorithms mutually supported by the client and the | there are signing algorithms mutually supported by the client and the | |||
| server. Use of signing algorithm metadata is described in Section 4. | server. Use of signing algorithm metadata is described in Section 4. | |||
| 10.6. TLS Security Considerations | 10.6. TLS Security Considerations | |||
| Current security considerations can be found in Recommendations for | Current security considerations can be found in "Recommendations for | |||
| Secure Use of TLS and DTLS [BCP195]. This supersedes the TLS version | Secure Use of Transport Layer Security (TLS) and Datagram Transport | |||
| Layer Security (DTLS)" [RFC7525]. This supersedes the TLS version | ||||
| recommendations in OAuth 2.0 [RFC6749]. | recommendations in OAuth 2.0 [RFC6749]. | |||
| 10.7. Parameter Mismatches | 10.7. Parameter Mismatches | |||
| Given that OAuth parameter values are being sent in two different | Given that OAuth parameter values are being sent in two different | |||
| places, as normal OAuth parameters and as Request Object claims, | places, as normal OAuth parameters and as Request Object claims, | |||
| implementations must guard against attacks that could use mismatching | implementations must guard against attacks that could use mismatching | |||
| parameter values to obtain unintended outcomes. That is the reason | parameter values to obtain unintended outcomes. That is the reason | |||
| that the two Client ID values MUST match, the reason that only the | that the two client ID values MUST match, the reason that only the | |||
| parameter values from the Request Object are to be used, and the | parameter values from the Request Object are to be used, and the | |||
| reason that neither "request" nor "request_uri" can appear in a | reason that neither "request" nor "request_uri" can appear in a | |||
| Request Object. | Request Object. | |||
| 10.8. Cross-JWT Confusion | 10.8. Cross-JWT Confusion | |||
| As described in Section 2.8 of [RFC8725], attackers may attempt to | As described in Section 2.8 of [RFC8725], attackers may attempt to | |||
| use a JWT issued for one purpose in a context that it was not | use a JWT issued for one purpose in a context that it was not | |||
| intended for. The mitigations described for these attacks can be | intended for. The mitigations described for these attacks can be | |||
| applied to Request Objects. | applied to Request Objects. | |||
| One way that an attacker might attempt to repurpose a Request Object | One way that an attacker might attempt to repurpose a Request Object | |||
| is to try to use it as a client authentication JWT, as described in | is to try to use it as a client authentication JWT, as described in | |||
| Section 2.2 of [RFC7523]. A simple way to prevent this is to never | Section 2.2 of [RFC7523]. A simple way to prevent this is to never | |||
| use the Client ID as the "sub" value in a Request Object. | use the client ID as the "sub" value in a Request Object. | |||
| Another way to prevent cross-JWT confusion is to use explicit typing, | Another way to prevent cross-JWT confusion is to use explicit typing, | |||
| as described in Section 3.11 of [RFC8725]. One would explicitly type | as described in Section 3.11 of [RFC8725]. One would explicitly type | |||
| a Request Object by including a "typ" Header Parameter with the value | a Request Object by including a "typ" Header Parameter with the value | |||
| "oauth-authz-req+jwt" (which is registered in Section 9.4.1. Note | "oauth-authz-req+jwt" (which is registered in Section 9.4.1). Note, | |||
| however, that requiring explicitly typed Requests Objects at existing | however, that requiring explicitly typed Request Objects at existing | |||
| authorization servers will break most existing deployments, as | authorization servers will break most existing deployments, as | |||
| existing clients are already commonly using untyped Request Objects, | existing clients are already commonly using untyped Request Objects, | |||
| especially with OpenID Connect [OpenID.Core]. However, requiring | especially with OpenID Connect [OpenID.Core]. However, requiring | |||
| explicit typing would be a good idea for new OAuth deployment | explicit typing would be a good idea for new OAuth deployment | |||
| profiles where compatibility with existing deployments is not a | profiles where compatibility with existing deployments is not a | |||
| consideration. | consideration. | |||
| Finally, yet another way to prevent cross-JWT confusion is to use a | Finally, yet another way to prevent cross-JWT confusion is to use a | |||
| key management regime in which keys used to sign Request Objects are | key management regime in which keys used to sign Request Objects are | |||
| identifiably distinct from those used for other purposes. Then, if | identifiably distinct from those used for other purposes. Then, if | |||
| an adversary attempts to repurpose the Request Object in another | an adversary attempts to repurpose the Request Object in another | |||
| context, a key mismatch will occur, thwarting the attack. | context, a key mismatch will occur, thwarting the attack. | |||
| 11. Privacy Considerations | 11. Privacy Considerations | |||
| When the Client is being granted access to a protected resource | When the client is being granted access to a protected resource | |||
| containing personal data, both the Client and the Authorization | containing personal data, both the client and the authorization | |||
| Server need to adhere to Privacy Principles. RFC 6973 Privacy | server need to adhere to Privacy Principles. "Privacy Considerations | |||
| Considerations for Internet Protocols [RFC6973] gives excellent | for Internet Protocols" [RFC6973] gives excellent guidance on the | |||
| guidance on the enhancement of protocol design and implementation. | enhancement of protocol design and implementation. The provisions | |||
| The provision listed in it should be followed. | listed in it should be followed. | |||
| Most of the provision would apply to The OAuth 2.0 Authorization | Most of the provisions would apply to "The OAuth 2.0 Authorization | |||
| Framework [RFC6749] and The OAuth 2.0 Authorization Framework: Bearer | Framework" [RFC6749] and "The OAuth 2.0 Authorization Framework: | |||
| Token Usage [RFC6750] and are not specific to this specification. In | Bearer Token Usage" [RFC6750] and are not specific to this | |||
| what follows, only the specific provisions to this specification are | specification. In what follows, only the provisions specific to this | |||
| noted. | specification are noted. | |||
| 11.1. Collection limitation | 11.1. Collection Limitation | |||
| When the Client is being granted access to a protected resource | When the client is being granted access to a protected resource | |||
| containing personal data, the Client SHOULD limit the collection of | containing personal data, the client SHOULD limit the collection of | |||
| personal data to that which is within the bounds of applicable law | personal data to that which is within the bounds of applicable law | |||
| and strictly necessary for the specified purpose(s). | and strictly necessary for the specified purpose(s). | |||
| It is often hard for the user to find out if the personal data asked | It is often hard for the user to find out if the personal data asked | |||
| for is strictly necessary. A trusted third-party service can help | for is strictly necessary. A trusted third-party service can help | |||
| the user by examining the Client request and comparing to the | the user by examining the client request, comparing it to the | |||
| proposed processing by the Client and certifying the request. After | proposed processing by the client, and certifying the request. After | |||
| the certification, the Client, when making an Authorization Request, | the certification, the client, when making an authorization request, | |||
| can submit Authorization Request to the trusted third-party service | can submit an authorization request to the trusted third-party | |||
| to obtain the Request Object URI. This process is two steps: | service to obtain the Request Object URI. This process has two | |||
| steps: | ||||
| (1) (Certification Process) The trusted third-party service examines | (1) (Certification Process) The trusted third-party service examines | |||
| the business process of the client and determines what claims | the business process of the client and determines what claims | |||
| they need: This is the certification process. Once the client | they need; this is the certification process. Once the client | |||
| is certified, then they are issued a client credential to | is certified, they are issued a client credential to | |||
| authenticate against to push request objects to the trusted | authenticate against to push Request Objects to the trusted | |||
| third-party service to get the "request_uri". | third-party service to get the "request_uri". | |||
| (2) (Translation Process) The client uses the client credential that | (2) (Translation Process) The client uses the client credential that | |||
| it got to push the request object to the trusted third-party | it got to push the Request Object to the trusted third-party | |||
| service to get the "request_uri". The trusted third-party | service to get the "request_uri". The trusted third-party | |||
| service also verifies that the Request Object is consistent with | service also verifies that the Request Object is consistent with | |||
| the claims that the client is eligible for, per prior step. | the claims that the client is eligible for, per the prior step. | |||
| Upon receiving such Request Object URI in the Authorization Request, | Upon receiving such a Request Object URI in the authorization | |||
| the Authorization Server first verifies that the authority portion of | request, the authorization server first verifies that the authority | |||
| the Request Object URI is a legitimate one for the trusted third- | portion of the Request Object URI is a legitimate one for the trusted | |||
| party service. Then, the Authorization Server issues HTTP GET | third-party service. Then, the authorization server issues an HTTP | |||
| request to the Request Object URI. Upon connecting, the | GET request to the Request Object URI. Upon connecting, the | |||
| Authorization Server MUST verify the server identity represented in | authorization server MUST verify that the server identity represented | |||
| the TLS certificate is legitimate for the Request Object URI. Then, | in the TLS certificate is legitimate for the Request Object URI. | |||
| the Authorization Server can obtain the Request Object, which | Then, the authorization server can obtain the Request Object, which | |||
| includes the "client_id" representing the Client. | includes the "client_id" representing the client. | |||
| The Consent screen MUST indicate the Client and SHOULD indicate that | The Consent screen MUST indicate the client and SHOULD indicate that | |||
| the request has been vetted by the trusted third-party service for | the request has been vetted by the trusted third-party service for | |||
| adherence to the Collection Limitation principle. | the adherence to the collection limitation principle. | |||
| 11.2. Disclosure Limitation | 11.2. Disclosure Limitation | |||
| 11.2.1. Request Disclosure | 11.2.1. Request Disclosure | |||
| This specification allows extension parameters. These may include | This specification allows extension parameters. These may include | |||
| potentially sensitive information. Since URI query parameter may | potentially sensitive information. Since URI query parameters may | |||
| leak through various means but most notably through referrer and | leak through various means but most notably through referrer and | |||
| browser history, if the authorization request contains a potentially | browser history, if the authorization request contains a potentially | |||
| sensitive parameter, the Client SHOULD JWE [RFC7516] encrypt the | sensitive parameter, the client SHOULD encrypt the Request Object | |||
| request object. | using JWE [RFC7516]. | |||
| Where Request Object URI method is being used, if the request object | Where the Request Object URI method is being used, if the Request | |||
| contains personally identifiable or sensitive information, the | Object contains personally identifiable or sensitive information, the | |||
| "request_uri" SHOULD be used only once, have a short validity period, | "request_uri" SHOULD be used only once and have a short validity | |||
| and MUST have large enough entropy deemed necessary with applicable | period, and it MUST have sufficient entropy for the applicable | |||
| security policy unless the Request Object itself is JWE [RFC7516] | security policies unless the Request Object itself is encrypted using | |||
| Encrypted. The adequate shortness of the validity and the entropy of | JWE [RFC7516]. The adequate shortness of the validity and the | |||
| the Request Object URI depends on the risk calculation based on the | entropy of the Request Object URI depends on the risk calculation | |||
| value of the resource being protected. A general guidance for the | based on the value of the resource being protected. A general | |||
| validity time would be less than a minute and the Request Object URI | guidance for the validity time would be less than a minute, and the | |||
| is to include a cryptographic random value of 128bit or more at the | Request Object URI is to include a cryptographic random value of 128 | |||
| time of the writing of this specification. | bits or more at the time of the writing of this specification. | |||
| 11.2.2. Tracking using Request Object URI | 11.2.2. Tracking Using Request Object URI | |||
| Even if the protected resource does not include a personally | Even if the protected resource does not include personally | |||
| identifiable information, it is sometimes possible to identify the | identifiable information, it is sometimes possible to identify the | |||
| user through the Request Object URI if persistent static per-user | user through the Request Object URI if persistent static per-user | |||
| Request Object URIs are used. A third party may observe it through | Request Object URIs are used. A third party may observe it through | |||
| browser history etc. and start correlating the user's activity using | browser history, etc. and start correlating the user's activity using | |||
| it. In a way, it is a data disclosure as well and should be avoided. | it. In a way, it is a data disclosure as well and should be avoided. | |||
| Therefore, per-user persistent Request Object URIs should be avoided. | Therefore, per-user persistent Request Object URIs should be avoided. | |||
| Single-use Request Object URIs are one alternative. | Single-use Request Object URIs are one alternative. | |||
| 12. Acknowledgements | 12. References | |||
| The following people contributed to the creation of this document in | ||||
| the OAuth working group and other IETF roles. (Affiliations at the | ||||
| time of the contribution are used.) | ||||
| Annabelle Backman (Amazon), Dirk Balfanz (Google), Sergey Beryozkin, | ||||
| Ben Campbell (as AD), Brian Campbell (Ping Identity), Roman Danyliw | ||||
| (as AD), Martin Duke (as AD), Vladimir Dzhuvinov (Connect2id), Lars | ||||
| Eggert (as AD), Joel Halpern (as GENART), Benjamin Kaduk (as AD), | ||||
| Stephen Kent (as SECDIR), Murray Kucherawy (as AD), Warren Kumari (as | ||||
| OPSDIR), Watson Ladd (as SECDIR), Torsten Lodderstedt (yes.com), Jim | ||||
| Manico, Axel Nennker (Deutsche Telecom), Hannes Tschofenig (ARM), | ||||
| James H. Manger (Telstra), Kathleen Moriarty (as AD), John Panzer | ||||
| (Google), Francesca Palombini (as AD), David Recordon (Facebook), | ||||
| Marius Scurtescu (Google), Luke Shepard (Facebook), Filip Skokan | ||||
| (Auth0), Eric Vyncke (as AD), and Robert Wilton (as AD). | ||||
| The following people contributed to creating this document through | ||||
| the OpenID Connect Core 1.0 [OpenID.Core]. | ||||
| Brian Campbell (Ping Identity), George Fletcher (AOL), Ryo Itou | ||||
| (Mixi), Edmund Jay (Illumila), Breno de Medeiros (Google), Hideki | ||||
| Nara (TACT), Justin Richer (MITRE). | ||||
| 13. Revision History | ||||
| Note to the RFC Editor: Please remove this section from the final | ||||
| RFC. | ||||
| -34 | ||||
| o Addressed additional IESG comments by Murray Kucherawy and | ||||
| Francesca Palombini. | ||||
| -33 | ||||
| o Addressed IESG comments prior to 8-Apr-21 telechat. Thanks to | ||||
| Martin Duke, Lars Eggert, Benjamin Kaduk, Francesca Palombini, and | ||||
| Eric Vyncke for their reviews. | ||||
| -32 | ||||
| o Removed outdated JSON reference. | ||||
| -31 | ||||
| o Addressed SecDir review comments by Watson Ladd. | ||||
| -30 | ||||
| o Changed the MIME Type from "oauth.authz.req+jwt" to "oauth-authz- | ||||
| req+jwt", per advice from the designated experts. | ||||
| -29 | ||||
| o Uniformly use the Change Controller "IETF". | ||||
| -28 | ||||
| o Removed unused references, as suggested by Roman Danyliw. | ||||
| -27 | ||||
| o Edits by Mike Jones to address IESG and working group review | ||||
| comments, including: | ||||
| o Added Security Considerations text saying not to use the Client ID | ||||
| as the "sub" value to prevent Cross-JWT Confusion. | ||||
| o Added Security Considerations text about using explicit typing to | ||||
| prevent Cross-JWT Confusion. | ||||
| o Addressed Eric Vyncke's review comments. | ||||
| o Addressed Robert Wilton's review comments. | ||||
| o Addressed Murray Kucherawy's review comments. | ||||
| o Addressed Benjamin Kaduk's review comments. | ||||
| o Applied spelling and grammar corrections. | ||||
| -20 | ||||
| o BK comments | ||||
| o Section 3 Removed WAP | ||||
| o Section 4. Clarified authorization request object parameters, | ||||
| removed extension parameters from examples | ||||
| o Section 4. Specifies application/oauth.authz.req+jwt as mime-type | ||||
| fore request objects | ||||
| o Section 5.2.1 Added reference to Capability URLs | ||||
| o Section 5.2.3. Added entropy fragment to example request | ||||
| o Section 8. Replaced "subjectAltName dnsName" with "DNS-ID" | ||||
| o Section 9. Registers authorization request parameters in JWT | ||||
| Claims Registry. | ||||
| o Section 9. Registers application/oauth.authz.req in IANA mime- | ||||
| types registry | ||||
| o Section 10.1. Clarified encrypted request objects are "signed | ||||
| then encrypted" to maintain consistency | ||||
| o Section 10.2. Clarifies trust between AS and TFP | ||||
| o Section 10.3. Clarified endpoints subject to the practice | ||||
| o Section 10.4 Replaced "redirect_uri" to "request_uri" | ||||
| o Section 10.4. Added reference to RFC 3986 for risks | ||||
| o Section 10.4.1.d Deleted "do" to maintain grammar flow | ||||
| o Section 10.4.1, 10.4.2 Replaced "application/jose" to | ||||
| "application/jwt" | ||||
| o Section 12.1. Extended description for submitting authorization | ||||
| request to TFP to obtain request object | ||||
| o Section 12.2.2. Replaced per-user Request Object URI with static | ||||
| per-user Request URIs | ||||
| o Section 13. Combined OAuth WG contributors together | ||||
| o Section Whole doc Replaced application/jwt with application/ | ||||
| oauth.authz.req+jwt | ||||
| -19 | ||||
| o AD comments | ||||
| o Section 5.2.1. s/Requiest URI/Request URI/ | ||||
| o Section 8 s/[BCP195] ./[BCP195]./ | ||||
| o Section 10.3. s/sited/cited/ | ||||
| o Section 11. Typo. s/Curent/Current/ | ||||
| -17 | ||||
| o #78 Typos in content-type | ||||
| -16 | ||||
| o Treated remaining Ben Campbell comments. | ||||
| -15 | ||||
| o Removed further duplication | ||||
| -14 | ||||
| o #71 Reiterate dynamic params are included. | ||||
| o #70 Made clear that AS must return error. | ||||
| o #69 Inconsistency of the need to sign. | ||||
| o Fixed Mimetype. | ||||
| o #67 Inconsistence in requiring HTTPS in request URI. | ||||
| o #66 Dropped ISO 29100 reference. | ||||
| o #25 Removed Encrypt only option. | ||||
| o #59 Same with #25. | ||||
| -13 | ||||
| o add TLS Security Consideration section | ||||
| o replace RFC7525 reference with BCP195 | ||||
| o moved front tag in FETT reference to fix XML structure | ||||
| o changes reference from SoK to FETT | ||||
| -12 | ||||
| o fixes #62 - Alexey Melnikov Discuss | ||||
| o fixes #48 - OPSDIR Review : General - delete semicolons after list | ||||
| items | ||||
| o fixes #58 - DP Comments for the Last Call | ||||
| o fixes #57 - GENART - Remove "non-normative ... " from examples. | ||||
| o fixes #45 - OPSDIR Review : Introduction - are attacks discovered | ||||
| or already opened | ||||
| o fixes #49 - OPSDIR Review : Introduction - Inconsistent colons | ||||
| after initial sentence of list items. | ||||
| o fixes #53 - OPSDIR Review : 6.2 JWS Signed Request Object - | ||||
| Clarify JOSE Header | ||||
| o fixes #42 - OPSDIR Review : Introduction - readability of 'and' is | ||||
| confusing | ||||
| o fixes #50 - OPSDIR Review : Section 4 Request Object - Clarify | ||||
| 'signed, encrypted, or signed and encrypted' | ||||
| o fixes #39 - OPSDIR Review : Abstract - Explain/Clarify JWS and JWE | ||||
| o fixed #50 - OPSDIR Review : Section 4 Request Object - Clarify | ||||
| 'signed, encrypted, or signed and encrypted' | ||||
| o fixes #43 - OPSDIR Review : Introduction - 'properties' sounds | ||||
| awkward and are not exactly 'properties' | ||||
| o fixes #56 - OPSDIR Review : 12 Acknowledgements - 'contribution | ||||
| is' => 'contribution are' | ||||
| o fixes #55 - OPSDIR Review : 11.2.2 Privacy Considerations - ' It | ||||
| is in a way' => 'In a way, it is' | ||||
| o fixes #54 - OPSDIR Review : 11 Privacy Considerations - 'and not | ||||
| specific' => 'and are not specific' | ||||
| o fixes #51 - OPSDIR Review : Section 4 Request Object - 'It is | ||||
| fine' => 'It is recommended' | ||||
| o fixes #47 - OPSDIR Review : Introduction - 'over- the- wire' => | ||||
| 'over-the-wire' | ||||
| o fixes #46 - OPSDIR Review : Introduction - 'It allows' => 'The use | ||||
| of application security' for | ||||
| o fixes #44 - OPSDIR Review : Introduction - 'has' => 'have' | ||||
| o fixes #41 - OPSDIR Review : Introduction - missing 'is' before | ||||
| 'typically sent' | ||||
| o fixes #38 - OPSDIR Review : Section 11 - Delete 'freely | ||||
| accessible' regarding ISO 29100 | ||||
| -11 | ||||
| o s/bing/being/ | ||||
| o Added history for -10 | ||||
| -10 | ||||
| o #20: KM1 -- some wording that is awkward in the TLS section. | ||||
| o #21: KM2 - the additional attacks against OAuth 2.0 should also | ||||
| have a pointer | ||||
| o #22: KM3 -- Nit: in the first line of 10.4: | ||||
| o #23: KM4 -- Mention RFC6973 in Section 11 in addition to ISO 29100 | ||||
| o #24: SECDIR review: Section 4 -- Confusing requirements for | ||||
| sign+encrypt | ||||
| o #25: SECDIR review: Section 6 -- authentication and integrity need | ||||
| not be provided if the requestor encrypts the token? | ||||
| o #26: SECDIR Review: Section 10 -- why no reference for JWS | ||||
| algorithms? | ||||
| o #27: SECDIR Review: Section 10.2 - how to do the agreement between | ||||
| client and server "a priori"? | ||||
| o #28: SECDIR Review: Section 10.3 - Indication on "large entropy" | ||||
| and "short lifetime" should be indicated | ||||
| o #29: SECDIR Review: Section 10.3 - Typo | ||||
| o #30: SECDIR Review: Section 10.4 - typos and missing articles | ||||
| o #31: SECDIR Review: Section 10.4 - Clearer statement on the lack | ||||
| of endpoint identifiers needed | ||||
| o #32: SECDIR Review: Section 11 - ISO29100 needs to be moved to | ||||
| normative reference | ||||
| o #33: SECDIR Review: Section 11 - Better English and Entropy | ||||
| language needed | ||||
| o #34: Section 4: Typo | ||||
| o #35: More Acknowledgment | ||||
| o #36: DP - More precise qualification on Encryption needed. | ||||
| -09 | ||||
| o Minor Editorial Nits. | ||||
| o Section 10.4 added. | ||||
| o Explicit reference to Security consideration (10.2) added in | ||||
| section 5 and section 5.2. | ||||
| o , (add yourself) removed from the acknowledgment. | ||||
| -08 | ||||
| o Applied changes proposed by Hannes on 2016-06-29 on IETF OAuth | ||||
| list recorded as https://bitbucket.org/Nat/oauth-jwsreq/ | ||||
| issues/12/. | ||||
| o TLS requirements added. | ||||
| o Security Consideration reinforced. | ||||
| o Privacy Consideration added. | ||||
| o Introduction improved. | ||||
| -07 | ||||
| o Changed the abbrev to OAuth JAR from oauth-jar. | ||||
| o Clarified sig and enc methods. | ||||
| o Better English. | ||||
| o Removed claims from one of the example. | ||||
| o Re-worded the URI construction. | ||||
| o Changed the example to use request instead of request_uri. | ||||
| o Clarified that Request Object parameters take precedence | ||||
| regardless of request or request_uri parameters were used. | ||||
| o Generalized the language in 4.2.1 to convey the intent more | ||||
| clearly. | ||||
| o Changed "Server" to "Authorization Server" as a clarification. | ||||
| o Stopped talking about request_object_signing_alg. | ||||
| o IANA considerations now reflect the current status. | ||||
| o Added Brian Campbell to the contributors list. Made the lists | ||||
| alphabetic order based on the last names. Clarified that the | ||||
| affiliation is at the time of the contribution. | ||||
| o Added "older versions of " to the reference to IE URI length | ||||
| limitations. | ||||
| o Stopped talking about signed or unsigned JWS etc. | ||||
| o 1.Introduction improved. | ||||
| -06 | ||||
| o Added explanation on the 512 chars URL restriction. | ||||
| o Updated Acknowledgements. | ||||
| -05 | ||||
| o More alignment with OpenID Connect. | ||||
| -04 | ||||
| o Fixed typos in examples. (request_url -> request_uri, cliend_id -> | ||||
| client_id) | ||||
| o Aligned the error messages with the OAuth IANA registry. | ||||
| o Added another rationale for having request object. | ||||
| -03 | ||||
| o Fixed the non-normative description about the advantage of static | ||||
| signature. | ||||
| o Changed the requirement for the parameter values in the request | ||||
| itself and the request object from 'MUST MATCH" to 'Req Obj takes | ||||
| precedence. | ||||
| -02 | ||||
| o Now that they are RFCs, replaced JWS, JWE, etc. with RFC numbers. | ||||
| -01 | ||||
| o Copy Edits. | ||||
| 14. References | ||||
| 14.1. Normative References | ||||
| [BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | ||||
| "Recommendations for Secure Use of Transport Layer | ||||
| Security (TLS) and Datagram Transport Layer Security | ||||
| (DTLS)", BCP 195, RFC 7525, May 2015. | ||||
| [IANA.MediaTypes] | 12.1. Normative References | |||
| IANA, "Media Types", | ||||
| <http://www.iana.org/assignments/media-types>. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
| 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | |||
| 2003, <https://www.rfc-editor.org/info/rfc3629>. | 2003, <https://www.rfc-editor.org/info/rfc3629>. | |||
| skipping to change at page 33, line 42 ¶ | skipping to change at line 1142 ¶ | |||
| <https://www.rfc-editor.org/info/rfc7516>. | <https://www.rfc-editor.org/info/rfc7516>. | |||
| [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | |||
| DOI 10.17487/RFC7518, May 2015, | DOI 10.17487/RFC7518, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7518>. | <https://www.rfc-editor.org/info/rfc7518>. | |||
| [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | |||
| (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7519>. | <https://www.rfc-editor.org/info/rfc7519>. | |||
| [RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, | ||||
| "Recommendations for Secure Use of Transport Layer | ||||
| Security (TLS) and Datagram Transport Layer Security | ||||
| (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May | ||||
| 2015, <https://www.rfc-editor.org/info/rfc7525>. | ||||
| [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | |||
| (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | |||
| <https://www.rfc-editor.org/info/rfc8141>. | <https://www.rfc-editor.org/info/rfc8141>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
| Interchange Format", STD 90, RFC 8259, | Interchange Format", STD 90, RFC 8259, | |||
| DOI 10.17487/RFC8259, December 2017, | DOI 10.17487/RFC8259, December 2017, | |||
| <https://www.rfc-editor.org/info/rfc8259>. | <https://www.rfc-editor.org/info/rfc8259>. | |||
| [RFC8414] Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 | [RFC8414] Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 | |||
| Authorization Server Metadata", RFC 8414, | Authorization Server Metadata", RFC 8414, | |||
| DOI 10.17487/RFC8414, June 2018, | DOI 10.17487/RFC8414, June 2018, | |||
| <https://www.rfc-editor.org/info/rfc8414>. | <https://www.rfc-editor.org/info/rfc8414>. | |||
| 14.2. Informative References | 12.2. Informative References | |||
| [BASIN] Basin, D., Cremers, C., and S. Meier, "Provably Repairing | [BASIN] Basin, D., Cremers, C., and S. Meier, "Provably Repairing | |||
| the ISO/IEC 9798 Standard for Entity Authentication", | the ISO/IEC 9798 Standard for Entity Authentication", | |||
| Journal of Computer Security - Security and Trust | Journal of Computer Security - Security and Trust | |||
| Principles Volume 21 Issue 6, Pages 817-846, November | Principles, Volume 21, Issue 6, pp. 817-846, November | |||
| 2013, | 2013, | |||
| <https://www.cs.ox.ac.uk/people/cas.cremers/downloads/ | <https://www.cs.ox.ac.uk/people/cas.cremers/downloads/ | |||
| papers/BCM2012-iso9798.pdf>. | papers/BCM2012-iso9798.pdf>. | |||
| [CapURLs] Tennison, J., "Good Practices for Capability URLs", | [CapURLs] Tennison, J., Ed., "Good Practices for Capability URLs", | |||
| W3C Working Draft, February 2014, | W3C First Public Working Draft, 18 February 2014, | |||
| <https://www.w3.org/TR/capability-urls/>. | <https://www.w3.org/TR/capability-urls/>. | |||
| [IANA.JWT.Claims] | [IANA.JWT.Claims] | |||
| IANA, "JSON Web Token Claims", | IANA, "JSON Web Token (JWT)", | |||
| <http://www.iana.org/assignments/jwt>. | <https://www.iana.org/assignments/jwt>. | |||
| [IANA.MediaTypes] | ||||
| IANA, "Media Types", | ||||
| <https://www.iana.org/assignments/media-types>. | ||||
| [IANA.OAuth.Parameters] | [IANA.OAuth.Parameters] | |||
| IANA, "OAuth Parameters", | IANA, "OAuth Parameters", | |||
| <http://www.iana.org/assignments/oauth-parameters>. | <https://www.iana.org/assignments/oauth-parameters>. | |||
| [OpenID.Core] | [OpenID.Core] | |||
| Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and | Sakimura, N., Bradley, J., Jones, M.B., de Medeiros, B., | |||
| C. Mortimore, "OpenID Connect Core 1.0", OpenID | and C. Mortimore, "OpenID Connect Core 1.0 incorporating | |||
| Foundation Standards, February 2014, | errata set 1", OpenID Foundation Standards, 8 November | |||
| 2014, | ||||
| <http://openid.net/specs/openid-connect-core-1_0.html>. | <http://openid.net/specs/openid-connect-core-1_0.html>. | |||
| [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | |||
| Extensions (MIME) Part Two: Media Types", RFC 2046, | Extensions (MIME) Part Two: Media Types", RFC 2046, | |||
| DOI 10.17487/RFC2046, November 1996, | DOI 10.17487/RFC2046, November 1996, | |||
| <https://www.rfc-editor.org/info/rfc2046>. | <https://www.rfc-editor.org/info/rfc2046>. | |||
| [RFC6819] Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 | [RFC6819] Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 | |||
| Threat Model and Security Considerations", RFC 6819, | Threat Model and Security Considerations", RFC 6819, | |||
| DOI 10.17487/RFC6819, January 2013, | DOI 10.17487/RFC6819, January 2013, | |||
| skipping to change at page 35, line 31 ¶ | skipping to change at line 1235 ¶ | |||
| [RFC7591] Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and | [RFC7591] Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and | |||
| P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", | P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", | |||
| RFC 7591, DOI 10.17487/RFC7591, July 2015, | RFC 7591, DOI 10.17487/RFC7591, July 2015, | |||
| <https://www.rfc-editor.org/info/rfc7591>. | <https://www.rfc-editor.org/info/rfc7591>. | |||
| [RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best | [RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best | |||
| Current Practices", BCP 225, RFC 8725, | Current Practices", BCP 225, RFC 8725, | |||
| DOI 10.17487/RFC8725, February 2020, | DOI 10.17487/RFC8725, February 2020, | |||
| <https://www.rfc-editor.org/info/rfc8725>. | <https://www.rfc-editor.org/info/rfc8725>. | |||
| Acknowledgements | ||||
| The following people contributed to the creation of this document in | ||||
| the OAuth Working Group and other IETF roles. (Affiliations at the | ||||
| time of the contribution are used.) | ||||
| Annabelle Backman (Amazon), Dirk Balfanz (Google), Sergey Beryozkin, | ||||
| Ben Campbell (as AD), Brian Campbell (Ping Identity), Roman Danyliw | ||||
| (as AD), Martin Duke (as AD), Vladimir Dzhuvinov (Connect2id), Lars | ||||
| Eggert (as AD), Joel Halpern (as GENART), Benjamin Kaduk (as AD), | ||||
| Stephen Kent (as SECDIR), Murray Kucherawy (as AD), Warren Kumari (as | ||||
| OPSDIR), Watson Ladd (as SECDIR), Torsten Lodderstedt (yes.com), Jim | ||||
| Manico, James H. Manger (Telstra), Kathleen Moriarty (as AD), Axel | ||||
| Nennker (Deutsche Telecom), John Panzer (Google), Francesca Palombini | ||||
| (as AD), David Recordon (Facebook), Marius Scurtescu (Google), Luke | ||||
| Shepard (Facebook), Filip Skokan (Auth0), Hannes Tschofenig (ARM), | ||||
| Éric Vyncke (as AD), and Robert Wilton (as AD). | ||||
| The following people contributed to creating this document through | ||||
| the OpenID Connect Core 1.0 [OpenID.Core]. | ||||
| Brian Campbell (Ping Identity), George Fletcher (AOL), Ryo Itou | ||||
| (Mixi), Edmund Jay (Illumila), Breno de Medeiros (Google), Hideki | ||||
| Nara (TACT), and Justin Richer (MITRE). | ||||
| Authors' Addresses | Authors' Addresses | |||
| Nat Sakimura | Nat Sakimura | |||
| NAT.Consulting | NAT.Consulting | |||
| 2-22-17 Naka | 2-22-17 Naka | |||
| Kunitachi, Tokyo 186-0004 | Kunitachi, Tokyo 186-0004 | |||
| Japan | Japan | |||
| Phone: +81-42-580-7401 | Phone: +81-42-580-7401 | |||
| Email: nat@nat.consulting | Email: nat@nat.consulting | |||
| URI: http://nat.sakimura.org/ | URI: https://nat.sakimura.org/ | |||
| John Bradley | John Bradley | |||
| Yubico | Yubico | |||
| Casilla 177, Sucursal Talagante | Sucursal Talagante | |||
| Talagante, RM | Casilla 177 | |||
| Talagante | ||||
| RM | ||||
| Chile | Chile | |||
| Phone: +1.202.630.5272 | Phone: +1.202.630.5272 | |||
| Email: ve7jtb@ve7jtb.com | Email: rfc9101@ve7jtb.com | |||
| URI: http://www.thread-safe.com/ | URI: http://www.thread-safe.com/ | |||
| Michael B. Jones | Michael B. Jones | |||
| Microsoft | Microsoft | |||
| One Microsoft Way | One Microsoft Way | |||
| Redmond, Washington 98052 | Redmond, Washington 98052 | |||
| United States of America | United States of America | |||
| Email: mbj@microsoft.com | Email: mbj@microsoft.com | |||
| URI: https://self-issued.info/ | URI: https://self-issued.info/ | |||
| End of changes. 181 change blocks. | ||||
| 869 lines changed or deleted | 512 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||