rfc9126.original | rfc9126.txt | |||
---|---|---|---|---|
Web Authorization Protocol T. Lodderstedt | Internet Engineering Task Force (IETF) T. Lodderstedt | |||
Internet-Draft yes.com | Request for Comments: 9126 yes.com | |||
Intended status: Standards Track B. Campbell | Category: Standards Track B. Campbell | |||
Expires: 30 January 2022 Ping Identity | ISSN: 2070-1721 Ping Identity | |||
N. Sakimura | N. Sakimura | |||
NAT.Consulting | NAT.Consulting | |||
D. Tonge | D. Tonge | |||
Moneyhub Financial Technology | Moneyhub Financial Technology | |||
F. Skokan | F. Skokan | |||
Auth0 | Auth0 | |||
29 July 2021 | September 2021 | |||
OAuth 2.0 Pushed Authorization Requests | OAuth 2.0 Pushed Authorization Requests | |||
draft-ietf-oauth-par-10 | ||||
Abstract | Abstract | |||
This document defines the pushed authorization request (PAR) | This document defines the pushed authorization request (PAR) | |||
endpoint, which allows clients to push the payload of an OAuth 2.0 | endpoint, which allows clients to push the payload of an OAuth 2.0 | |||
authorization request to the authorization server via a direct | authorization request to the authorization server via a direct | |||
request and provides them with a request URI that is used as | request and provides them with a request URI that is used as | |||
reference to the data in a subsequent call to the authorization | reference to the data in a subsequent call to the authorization | |||
endpoint. | endpoint. | |||
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 | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 30 January 2022. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9126. | ||||
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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as described in Section 4.e of the Trust Legal Provisions and are | include Simplified BSD License text as described in Section 4.e of | |||
provided without warranty as described in the Simplified BSD License. | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
1.1. Introductory Example . . . . . . . . . . . . . . . . . . 4 | 1.1. Introductory Example | |||
1.2. Conventions and Terminology . . . . . . . . . . . . . . . 5 | 1.2. Conventions and Terminology | |||
2. Pushed Authorization Request Endpoint . . . . . . . . . . . . 6 | 2. Pushed Authorization Request Endpoint | |||
2.1. Request . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.1. Request | |||
2.2. Successful Response . . . . . . . . . . . . . . . . . . . 9 | 2.2. Successful Response | |||
2.3. Error Response . . . . . . . . . . . . . . . . . . . . . 10 | 2.3. Error Response | |||
2.4. Management of Client Redirect URIs . . . . . . . . . . . 11 | 2.4. Management of Client Redirect URIs | |||
3. The "request" Request Parameter . . . . . . . . . . . . . . . 12 | 3. The "request" Request Parameter | |||
4. Authorization Request . . . . . . . . . . . . . . . . . . . . 14 | 4. Authorization Request | |||
5. Authorization Server Metadata . . . . . . . . . . . . . . . . 15 | 5. Authorization Server Metadata | |||
6. Client Metadata . . . . . . . . . . . . . . . . . . . . . . . 16 | 6. Client Metadata | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 16 | 7. Security Considerations | |||
7.1. Request URI Guessing . . . . . . . . . . . . . . . . . . 16 | 7.1. Request URI Guessing | |||
7.2. Open Redirection . . . . . . . . . . . . . . . . . . . . 16 | 7.2. Open Redirection | |||
7.3. Request Object Replay . . . . . . . . . . . . . . . . . . 16 | 7.3. Request Object Replay | |||
7.4. Client Policy Change . . . . . . . . . . . . . . . . . . 17 | 7.4. Client Policy Change | |||
7.5. Request URI Swapping . . . . . . . . . . . . . . . . . . 17 | 7.5. Request URI Swapping | |||
8. Privacy Considerations . . . . . . . . . . . . . . . . . . . 17 | 8. Privacy Considerations | |||
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 17 | 9. IANA Considerations | |||
10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18 | 9.1. OAuth Authorization Server Metadata | |||
10.1. OAuth Authorization Server Metadata . . . . . . . . . . 18 | 9.2. OAuth Dynamic Client Registration Metadata | |||
10.2. OAuth Dynamic Client Registration Metadata . . . . . . . 18 | 9.3. OAuth URI Registration | |||
10.3. OAuth URI Registration . . . . . . . . . . . . . . . . . 18 | 10. References | |||
11. Normative References . . . . . . . . . . . . . . . . . . . . 18 | 10.1. Normative References | |||
12. Informative References . . . . . . . . . . . . . . . . . . . 19 | 10.2. Informative References | |||
Appendix A. Document History . . . . . . . . . . . . . . . . . . 21 | Acknowledgements | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 23 | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
A pushed authorization request (PAR), defined by this document, | This document defines the pushed authorization request (PAR) | |||
enables an OAuth [RFC6749] client to push the payload of an | endpoint, which enables an OAuth [RFC6749] client to push the payload | |||
authorization request directly to the authorization server. A | of an authorization request directly to the authorization server. A | |||
request URI value is received in in exchange, which is used as | request URI value is received in exchange; it is used as reference to | |||
reference to the authorization request payload data in a subsequent | the authorization request payload data in a subsequent call to the | |||
call to the authorization endpoint via the user agent. | authorization endpoint via the user agent. | |||
In OAuth [RFC6749] authorization request parameters are typically | In OAuth [RFC6749], authorization request parameters are typically | |||
sent as URI query parameters via redirection in the user agent. This | sent as URI query parameters via redirection in the user agent. This | |||
is simple but also yields challenges: | is simple but also yields challenges: | |||
* There is no cryptographic integrity and authenticity protection. | * There is no cryptographic integrity and authenticity protection. | |||
An attacker could, for example, modify the scope of access | An attacker could, for example, modify the scope of access | |||
requested or swap the context of a payment transaction by changing | requested or swap the context of a payment transaction by changing | |||
scope values. Although protocol facilities exist to enable | scope values. Although protocol facilities exist to enable | |||
clients or users to detect some such changes, preventing | clients or users to detect some such changes, preventing | |||
modifications early in the process is a more robust solution. | modifications early in the process is a more robust solution. | |||
* There is no mechanism to ensure confidentiality of the request | * There is no mechanism to ensure confidentiality of the request | |||
parameters. Although HTTPS is required for the authorization | parameters. Although HTTPS is required for the authorization | |||
endpoint, the request data passes through the user agent in the | endpoint, the request data passes through the user agent in the | |||
clear and query string data can inadvertently leak to web server | clear, and query string data can inadvertently leak to web server | |||
logs and to other sites via referer. The impact of such leakage | logs and to other sites via the referer. The impact of such | |||
can be significant, if personally identifiable information or | leakage can be significant, if personally identifiable information | |||
other regulated data is sent in the authorization request (which | or other regulated data is sent in the authorization request | |||
might well be the case in identity, open banking, and similar | (which might well be the case in identity, open banking, and | |||
scenarios). | similar scenarios). | |||
* Authorization request URLs can become quite large, especially in | * Authorization request URLs can become quite large, especially in | |||
scenarios requiring fine-grained authorization data, which might | scenarios requiring fine-grained authorization data, which might | |||
cause errors in request processing. | cause errors in request processing. | |||
JWT Secured Authorization Request (JAR) [I-D.ietf-oauth-jwsreq] | JWT-Secured Authorization Request (JAR) [RFC9101] provides solutions | |||
provides solutions for the security challenges by allowing OAuth | for the security challenges by allowing OAuth clients to wrap | |||
clients to wrap authorization request parameters in a request object, | authorization request parameters in a Request Object, which is a | |||
which is a signed and optionally encrypted JSON Web Token (JWT) | signed and optionally encrypted JSON Web Token (JWT) [RFC7519]. In | |||
[RFC7519]. In order to cope with the size restrictions, JAR | order to cope with the size restrictions, JAR introduces the | |||
introduces the "request_uri" parameter that allows clients to send a | "request_uri" parameter that allows clients to send a reference to a | |||
reference to a request object instead of the request object itself. | Request Object instead of the Request Object itself. | |||
This document complements JAR by providing an interoperable way to | This document complements JAR by providing an interoperable way to | |||
push the payload of an authorization request directly to the | push the payload of an authorization request directly to the | |||
authorization server in exchange for a "request_uri" value usable at | authorization server in exchange for a "request_uri" value usable at | |||
the authorization server in a subsequent authorization request. | the authorization server in a subsequent authorization request. | |||
PAR fosters OAuth security by providing clients a simple means for a | PAR fosters OAuth security by providing clients a simple means for a | |||
confidential and integrity protected authorization request. Clients | confidential and integrity-protected authorization request. Clients | |||
requiring an even higher security level, especially cryptographically | requiring an even higher security level, especially cryptographically | |||
confirmed non-repudiation, are able to use JWT-based request objects | confirmed non-repudiation, are able to use JWT-based Request Objects | |||
as defined by [I-D.ietf-oauth-jwsreq] in conduction with PAR. | as defined by [RFC9101] in conjunction with PAR. | |||
PAR allows the authorization server to authenticate the client before | PAR allows the authorization server to authenticate the client before | |||
any user interaction happens. The increased confidence in the | any user interaction happens. The increased confidence in the | |||
identity of the client during the authorization process allows the | identity of the client during the authorization process allows the | |||
authorization server to refuse illegitimate requests much earlier in | authorization server to refuse illegitimate requests much earlier in | |||
the process, which can prevent attempts to spoof clients or otherwise | the process, which can prevent attempts to spoof clients or otherwise | |||
tamper with or misuse an authorization request. | tamper with or misuse an authorization request. | |||
Note that HTTP "POST" requests to the authorization endpoint via the | Note that HTTP "POST" requests to the authorization endpoint via the | |||
user agent, as described in Section 3.1 of [RFC6749] and | user agent, as described in Section 3.1 of [RFC6749] and | |||
Section 3.1.2.1 of [OIDC], could also be used to cope with the | Section 3.1.2.1 of [OIDC], could also be used to cope with the | |||
request size limitations described above. However, it's only | request size limitations described above. However, it's only | |||
optional per [RFC6749] and, even when supported, it is a viable | optional per [RFC6749], and, even when supported, it is a viable | |||
option for traditional web applications but is prohibitively | option for conventional web applications but is prohibitively | |||
difficult to use with native mobile applications. As described in | difficult to use with installed mobile applications. As described in | |||
[RFC8252] those apps use platform-specific APIs to open the | [RFC8252], those apps use platform-specific APIs to open the | |||
authorization request URI in the system browser. When a native app | authorization request URI in the system browser. When a mobile app | |||
launches a browser, however, the resultant initial request is | launches a browser, however, the resultant initial request is | |||
constrained to use the "GET" method. Using "POST" for the | constrained to use the "GET" method. Using "POST" for the | |||
authorization request would require the app to first direct the | authorization request would require the app to first direct the | |||
browser to open a URI that the app controls via "GET" while somehow | browser to open a URI that the app controls via "GET" while somehow | |||
conveying the sizable authorization request payload and then have the | conveying the sizable authorization request payload and then having | |||
resultant response contain content and script to initiate a cross- | the resultant response contain the content and script to initiate a | |||
site form "POST" towards the authorization server. PAR is simpler to | cross-site form "POST" towards the authorization server. PAR is | |||
use and has additional security benefits described above. | simpler to use and has additional security benefits, as described | |||
above. | ||||
1.1. Introductory Example | 1.1. Introductory Example | |||
In traditional OAuth 2.0, a client typically initiates an | In conventional OAuth 2.0, a client typically initiates an | |||
authorization request by directing the user agent to make an HTTP | authorization request by directing the user agent to make an HTTP | |||
request like the following to the authorization server's | request like the following to the authorization server's | |||
authorization endpoint (extra line breaks and indentation for display | authorization endpoint (extra line breaks and indentation for display | |||
purposes only): | purposes only): | |||
GET /authorize?response_type=code | GET /authorize?response_type=code | |||
&client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen | &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen | |||
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1 | &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Such a request could instead be pushed directly to the authorization | Such a request could instead be pushed directly to the authorization | |||
server by the client with a "POST" request to the PAR endpoint as | server by the client with a "POST" request to the PAR endpoint as | |||
illustrated in the following example (extra line breaks and | illustrated in the following example (extra line breaks and spaces | |||
whitespace for display purposes only). The client can authenticate | for display purposes only). The client can authenticate (e.g., using | |||
(e.g., using JWT client assertion based authentication as shown) | JWT client assertion-based authentication as shown) because the | |||
because the request is made directly to the authorization server. | request is made directly to the authorization server. | |||
POST /as/par HTTP/1.1 | POST /as/par HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
&response_type=code | &response_type=code | |||
&client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen | &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen | |||
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb | &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb | |||
&client_assertion_type= | &client_assertion_type= | |||
urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer | urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer | |||
skipping to change at page 5, line 44 ¶ | skipping to change at line 223 ¶ | |||
only): | only): | |||
GET /authorize?client_id=CLIENT1234 | GET /authorize?client_id=CLIENT1234 | |||
&request_uri=urn%3Aexample%3Abwc4JK-ESC0w8acc191e-Y1LTC2 HTTP/1.1 | &request_uri=urn%3Aexample%3Abwc4JK-ESC0w8acc191e-Y1LTC2 HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
1.2. Conventions and Terminology | 1.2. Conventions and Terminology | |||
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. | |||
This specification uses the terms "access token", "authorization | This specification uses the terms "access token", "authorization | |||
server", "authorization endpoint", "authorization request", "token | server", "authorization endpoint", "authorization request", "token | |||
endpoint", and "client" defined by The OAuth 2.0 Authorization | endpoint", and "client" defined by "The OAuth 2.0 Authorization | |||
Framework [RFC6749]. | Framework" [RFC6749]. | |||
2. Pushed Authorization Request Endpoint | 2. Pushed Authorization Request Endpoint | |||
The pushed authorization request endpoint is an HTTP API at the | The pushed authorization request endpoint is an HTTP API at the | |||
authorization server that accepts HTTP "POST" requests with | authorization server that accepts HTTP "POST" requests with | |||
parameters in the HTTP request message body using the "application/x- | parameters in the HTTP request message body using the "application/x- | |||
www-form-urlencoded" format with a character encoding of UTF-8 as | www-form-urlencoded" format. This format has a character encoding of | |||
described in Appendix B of [RFC6749]. The PAR endpoint URL MUST use | UTF-8, as described in Appendix B of [RFC6749]. The PAR endpoint URL | |||
the "https" scheme. | MUST use the "https" scheme. | |||
Authorization servers supporting PAR SHOULD include the URL of their | Authorization servers supporting PAR SHOULD include the URL of their | |||
pushed authorization request endpoint in their authorization server | pushed authorization request endpoint in their authorization server | |||
metadata document [RFC8414] using the | metadata document [RFC8414] using the | |||
"pushed_authorization_request_endpoint" parameter as defined in | "pushed_authorization_request_endpoint" parameter as defined in | |||
Section 5. | Section 5. | |||
The endpoint accepts the authorization request parameters defined in | The endpoint accepts the authorization request parameters defined in | |||
[RFC6749] for the authorization endpoint as well as all applicable | [RFC6749] for the authorization endpoint as well as all applicable | |||
extensions defined for the authorization endpoint. Some examples of | extensions defined for the authorization endpoint. Some examples of | |||
such extensions include PKCE [RFC7636], Resource Indicators | such extensions include Proof Key for Code Exchange (PKCE) [RFC7636], | |||
[RFC8707], and OpenID Connect [OIDC]. The endpoint MAY also support | Resource Indicators [RFC8707], and OpenID Connect (OIDC) [OIDC]. The | |||
sending the set of authorization request parameters as a request | endpoint MAY also support sending the set of authorization request | |||
object according to [I-D.ietf-oauth-jwsreq] and Section 3. | parameters as a Request Object according to [RFC9101] and Section 3 | |||
of this document. | ||||
The rules for client authentication as defined in [RFC6749] for token | The rules for client authentication as defined in [RFC6749] for token | |||
endpoint requests, including the applicable authentication methods, | endpoint requests, including the applicable authentication methods, | |||
apply for the PAR endpoint as well. If applicable, the | apply for the PAR endpoint as well. If applicable, the | |||
"token_endpoint_auth_method" client metadata [RFC7591] parameter | "token_endpoint_auth_method" client metadata parameter [RFC7591] | |||
indicates the registered authentication method for the client to use | indicates the registered authentication method for the client to use | |||
when making direct requests to the authorization server, including | when making direct requests to the authorization server, including | |||
requests to the PAR endpoint. Similarly, the | requests to the PAR endpoint. Similarly, the | |||
"token_endpoint_auth_methods_supported" authorization server metadata | "token_endpoint_auth_methods_supported" authorization server metadata | |||
[RFC8414] parameter lists client authentication methods supported by | [RFC8414] parameter lists client authentication methods supported by | |||
the authorization server when accepting direct requests from clients, | the authorization server when accepting direct requests from clients, | |||
including requests to the PAR endpoint. | including requests to the PAR endpoint. | |||
Due to historical reasons there is potential ambiguity regarding the | Due to historical reasons, there is potential ambiguity regarding the | |||
appropriate audience value to use when employing JWT client assertion | appropriate audience value to use when employing JWT client | |||
based authentication (defined in Section 2.2 of [RFC7523] with | assertion-based authentication (defined in Section 2.2 of [RFC7523] | |||
"private_key_jwt" or "client_secret_jwt" authentication method names | with "private_key_jwt" or "client_secret_jwt" authentication method | |||
per Section 9 of [OIDC]). To address that ambiguity the issuer | names per Section 9 of [OIDC]). To address that ambiguity, the | |||
identifier URL of the authorization server according to [RFC8414] | issuer identifier URL of the authorization server according to | |||
SHOULD be used as the value of the audience. In order to facilitate | [RFC8414] SHOULD be used as the value of the audience. In order to | |||
interoperability the authorization server MUST accept its issuer | facilitate interoperability, the authorization server MUST accept its | |||
identifier, token endpoint URL, or pushed authorization request | issuer identifier, token endpoint URL, or pushed authorization | |||
endpoint URL as values that identify it as an intended audience. | request endpoint URL as values that identify it as an intended | |||
audience. | ||||
2.1. Request | 2.1. Request | |||
A client sends the parameters that comprise an authorization request | A client sends the parameters that comprise an authorization request | |||
directly to the PAR endpoint. A typical parameter set might include: | directly to the PAR endpoint. A typical parameter set might include: | |||
"client_id", "response_type", "redirect_uri", "scope", "state", | "client_id", "response_type", "redirect_uri", "scope", "state", | |||
"code_challenge", and "code_challenge_method" as shown in the example | "code_challenge", and "code_challenge_method" as shown in the example | |||
below. However, the pushed authorization request can be composed of | below. However, the pushed authorization request can be composed of | |||
any of the parameters applicable for use at authorization endpoint | any of the parameters applicable for use at the authorization | |||
including those defined in [RFC6749] as well as all applicable | endpoint, including those defined in [RFC6749] as well as all | |||
extensions. The "request_uri" authorization request parameter is one | applicable extensions. The "request_uri" authorization request | |||
exception, which MUST NOT be provided. | parameter is one exception, and it MUST NOT be provided. | |||
The request also includes, as appropriate for the given client, any | The request also includes, as appropriate for the given client, any | |||
additional parameters necessary for client authentication (e.g., | additional parameters necessary for client authentication (e.g., | |||
"client_secret", or "client_assertion" and "client_assertion_type"). | "client_secret" or "client_assertion" and "client_assertion_type"). | |||
Such parameters are defined and registered for use at the token | Such parameters are defined and registered for use at the token | |||
endpoint but are applicable only for client authentication. When | endpoint but are applicable only for client authentication. When | |||
present in a pushed authorization request, they are relied upon only | present in a pushed authorization request, they are relied upon only | |||
for client authentication and are not germane to the authorization | for client authentication and are not germane to the authorization | |||
request itself. Any token endpoint parameters that are not related | request itself. Any token endpoint parameters that are not related | |||
to client authentication have no defined meaning for a pushed | to client authentication have no defined meaning for a pushed | |||
authorization request. The "client_id" parameter is defined with the | authorization request. The "client_id" parameter is defined with the | |||
same semantics for both authorization requests and requests to the | same semantics for both authorization requests and requests to the | |||
token endpoint; as a required authorization request parameter, it is | token endpoint; as a required authorization request parameter, it is | |||
similarly required in a pushed authorization request. | similarly required in a pushed authorization request. | |||
The client constructs the message body of an HTTP "POST" request with | The client constructs the message body of an HTTP "POST" request with | |||
"x-www-form-urlencoded" formatted parameters using a character | parameters formatted with "x-www-form-urlencoded" using a character | |||
encoding of UTF-8 as described in Appendix B of [RFC6749]. If | encoding of UTF-8, as described in Appendix B of [RFC6749]. If | |||
applicable, the client also adds its authentication credentials to | applicable, the client also adds its authentication credentials to | |||
the request header or the request body using the same rules as for | the request header or the request body using the same rules as for | |||
token endpoint requests. | token endpoint requests. | |||
This is illustrated by the following example (extra line breaks in | This is illustrated by the following example (extra line breaks in | |||
the message body for display purposes only): | the message body for display purposes only): | |||
POST /as/par HTTP/1.1 | POST /as/par HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
skipping to change at page 8, line 41 ¶ | skipping to change at line 352 ¶ | |||
parameter is provided. | parameter is provided. | |||
3. Validate the pushed request as it would an authorization request | 3. Validate the pushed request as it would an authorization request | |||
sent to the authorization endpoint. For example, the | sent to the authorization endpoint. For example, the | |||
authorization server checks whether the redirect URI matches one | authorization server checks whether the redirect URI matches one | |||
of the redirect URIs configured for the client and also checks | of the redirect URIs configured for the client and also checks | |||
whether the client is authorized for the scope for which it is | whether the client is authorized for the scope for which it is | |||
requesting access. This validation allows the authorization | requesting access. This validation allows the authorization | |||
server to refuse unauthorized or fraudulent requests early. The | server to refuse unauthorized or fraudulent requests early. The | |||
authorization server MAY omit validation steps that it is unable | authorization server MAY omit validation steps that it is unable | |||
to perform when processing the pushed request, however, such | to perform when processing the pushed request; however, such | |||
checks MUST then be performed when processing the authorization | checks MUST then be performed when processing the authorization | |||
request at the authorization endpoint. | request at the authorization endpoint. | |||
The authorization server MAY allow clients with authentication | The authorization server MAY allow clients with authentication | |||
credentials to establish per-authorization-request redirect URIs with | credentials to establish per-authorization-request redirect URIs with | |||
every pushed authorization request. Described in more detail in | every pushed authorization request. Described in more detail in | |||
Section 2.4, this is possible since, in contrast to [RFC6749], this | Section 2.4, this is possible since, in contrast to [RFC6749], this | |||
specification gives the authorization server the ability to | specification gives the authorization server the ability to | |||
authenticate clients and validate client requests before the actual | authenticate clients and validate client requests before the actual | |||
authorization request is performed. | authorization request is performed. | |||
2.2. Successful Response | 2.2. Successful Response | |||
If the verification is successful, the server MUST generate a request | If the verification is successful, the server MUST generate a request | |||
URI and provide it in the response with a "201" HTTP status code. | URI and provide it in the response with a "201" HTTP status code. | |||
The following parameters are included as top-level members in the | The following parameters are included as top-level members in the | |||
message body of the HTTP response using the "application/json" media | message body of the HTTP response using the "application/json" media | |||
type as defined by [RFC8259]. | type as defined by [RFC8259]. | |||
* "request_uri" : The request URI corresponding to the authorization | request_uri | |||
request posted. This URI is a single-use reference to the | The request URI corresponding to the authorization request posted. | |||
respective request data in the subsequent authorization request. | This URI is a single-use reference to the respective request data | |||
The way the authorization process obtains the authorization | in the subsequent authorization request. The way the | |||
request data is at the discretion of the authorization server and | authorization process obtains the authorization request data is at | |||
out of scope of this specification. There is no need to make the | the discretion of the authorization server and is out of scope of | |||
authorization request data available to other parties via this | this specification. There is no need to make the authorization | |||
URI. | request data available to other parties via this URI. | |||
* "expires_in" : A JSON number that represents the lifetime of the | expires_in | |||
request URI in seconds as a positive integer. The request URI | A JSON number that represents the lifetime of the request URI in | |||
lifetime is at the discretion of the authorization server but will | seconds as a positive integer. The request URI lifetime is at the | |||
typically be relatively short (e.g., between 5 and 600 seconds). | discretion of the authorization server but will typically be | |||
relatively short (e.g., between 5 and 600 seconds). | ||||
The format of the "request_uri" value is at the discretion of the | The format of the "request_uri" value is at the discretion of the | |||
authorization server but it MUST contain some part generated using a | authorization server, but it MUST contain some part generated using a | |||
cryptographically strong pseudorandom algorithm such that it is | cryptographically strong pseudorandom algorithm such that it is | |||
computationally infeasible to predict or guess a valid value (see | computationally infeasible to predict or guess a valid value (see | |||
Section 10.10 of [RFC6749] for specifics). The authorization server | Section 10.10 of [RFC6749] for specifics). The authorization server | |||
MAY construct the "request_uri" value using the form | MAY construct the "request_uri" value using the form | |||
"urn:ietf:params:oauth:request_uri:<reference-value>" with | "urn:ietf:params:oauth:request_uri:<reference-value>" with | |||
"<reference-value>" as the random part of the URI that references the | "<reference-value>" as the random part of the URI that references the | |||
respective authorization request data. | respective authorization request data. | |||
The "request_uri" value MUST be bound to the client that posted the | The "request_uri" value MUST be bound to the client that posted the | |||
authorization request. | authorization request. | |||
skipping to change at page 10, line 13 ¶ | skipping to change at line 420 ¶ | |||
} | } | |||
2.3. Error Response | 2.3. Error Response | |||
The authorization server returns an error response with the same | The authorization server returns an error response with the same | |||
format as is specified for error responses from the token endpoint in | format as is specified for error responses from the token endpoint in | |||
Section 5.2 of [RFC6749] using the appropriate error code from | Section 5.2 of [RFC6749] using the appropriate error code from | |||
therein or from Section 4.1.2.1 of [RFC6749]. In those cases where | therein or from Section 4.1.2.1 of [RFC6749]. In those cases where | |||
Section 4.1.2.1 of [RFC6749] prohibits automatic redirection with an | Section 4.1.2.1 of [RFC6749] prohibits automatic redirection with an | |||
error back to the requesting client and hence doesn't define an error | error back to the requesting client and hence doesn't define an error | |||
code, for example when the request fails due to a missing, invalid, | code (for example, when the request fails due to a missing, invalid, | |||
or mismatching redirection URI, the "invalid_request" error code can | or mismatching redirection URI), the "invalid_request" error code can | |||
be used as the default error code. Error codes defined by OAuth | be used as the default error code. Error codes defined by the OAuth | |||
extension can also be used when such an extension is involved in the | extension can also be used when such an extension is involved in the | |||
initial processing of authorization request that was pushed. Since | initial processing of the authorization request that was pushed. | |||
initial processing of the pushed authorization request does not | Since initial processing of the pushed authorization request does not | |||
involve resource owner interaction, error codes related to user | involve resource owner interaction, error codes related to user | |||
interaction, such as "consent_required" defined by [OIDC], are never | interaction, such as "consent_required" defined by [OIDC], are never | |||
returned. | returned. | |||
If the client is required to use signed request objects, either by | If the client is required to use signed Request Objects, by either | |||
authorization server or client policy (see [I-D.ietf-oauth-jwsreq], | the authorization server or the client policy (see [RFC9101], | |||
section 10.5), the authorization server MUST only accept requests | Section 10.5), the authorization server MUST only accept requests | |||
complying with the definition given in Section 3 and MUST refuse any | complying with the definition given in Section 3 and MUST refuse any | |||
other request with HTTP status code 400 and error code | other request with HTTP status code 400 and error code | |||
"invalid_request". | "invalid_request". | |||
In addition to the above, the PAR endpoint can also make use of the | In addition to the above, the PAR endpoint can also make use of the | |||
following HTTP status codes: | following HTTP status codes: | |||
* 405: If the request did not use the "POST" method, the | 405: If the request did not use the "POST" method, the authorization | |||
authorization server responds with an HTTP 405 (Method Not | server responds with an HTTP 405 (Method Not Allowed) status | |||
Allowed) status code. | code. | |||
* 413: If the request size was beyond the upper bound that the | 413: If the request size was beyond the upper bound that the | |||
authorization server allows, the authorization server responds | authorization server allows, the authorization server responds | |||
with an HTTP 413 (Payload Too Large) status code. | with an HTTP 413 (Payload Too Large) status code. | |||
* 429: If the number of requests from a client during a particular | 429: If the number of requests from a client during a particular | |||
time period exceeds the number the authorization server allows, | time period exceeds the number the authorization server allows, | |||
the authorization server responds with an HTTP 429 (Too Many | the authorization server responds with an HTTP 429 (Too Many | |||
Requests) status code. | Requests) status code. | |||
The following is an example of an error response from the PAR | The following is an example of an error response from the PAR | |||
endpoint: | endpoint: | |||
HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-cache, no-store | Cache-Control: no-cache, no-store | |||
{ | { | |||
"error": "invalid_request", | "error": "invalid_request", | |||
"error_description": | "error_description": | |||
"The redirect_uri is not valid for the given client" | "The redirect_uri is not valid for the given client" | |||
} | } | |||
2.4. Management of Client Redirect URIs | 2.4. Management of Client Redirect URIs | |||
OAuth 2.0 [RFC6749] allows clients to use unregistered "redirect_uri" | OAuth 2.0 [RFC6749] allows clients to use unregistered "redirect_uri" | |||
values in certain circumstances or for the authorization server to | values in certain circumstances or for the authorization server to | |||
apply its own matching semantics to the "redirect_uri" value | apply its own matching semantics to the "redirect_uri" value | |||
presented by the client at the authorization endpoint. However, the | presented by the client at the authorization endpoint. However, the | |||
OAuth Security BCP [I-D.ietf-oauth-security-topics] as well as OAuth | OAuth security BCP [OAUTH-SECURITY-TOPICS] as well as the OAuth 2.1 | |||
2.1 [I-D.ietf-oauth-v2-1] require an authorization server exactly | specification [OAUTH-V2] require an authorization server to exactly | |||
match the "redirect_uri" parameter against the set of redirect URIs | match the "redirect_uri" parameter against the set of redirect URIs | |||
previously established for a particular client. This is a means for | previously established for a particular client. This is a means for | |||
early detection of client impersonation attempts and prevents token | early detection of client impersonation attempts and prevents token | |||
leakage and open redirection. As a downside, this can make client | leakage and open redirection. As a downside, this can make client | |||
management more cumbersome since the redirect URI is typically the | management more cumbersome since the redirect URI is typically the | |||
most volatile part of a client policy. | most volatile part of a client policy. | |||
The exact matching requirement MAY be relaxed when using PAR for | The exact matching requirement MAY be relaxed when using PAR for | |||
clients that have established authentication credentials with the | clients that have established authentication credentials with the | |||
authorization server. This is possible since, in contrast to a | authorization server. This is possible since, in contrast to a | |||
traditional authorization request, the authorization server | conventional authorization request, the authorization server | |||
authenticates the client before the authorization process starts and | authenticates the client before the authorization process starts and | |||
thus ensures it is interacting with the legitimate client. The | thus ensures it is interacting with the legitimate client. The | |||
authorization server MAY allow such clients to specify "redirect_uri" | authorization server MAY allow such clients to specify "redirect_uri" | |||
values that were not previously registered with the authorization | values that were not previously registered with the authorization | |||
server. This will give the client more flexibility (e.g., to mint | server. This will give the client more flexibility (e.g., to mint | |||
distinct redirect URI values per authorization server at runtime) and | distinct "redirect_uri" values per authorization server at runtime) | |||
can simplify client management. It is at the discretion of the | and can simplify client management. It is at the discretion of the | |||
authorization server to apply restrictions on supplied "redirect_uri" | authorization server to apply restrictions on supplied "redirect_uri" | |||
values, e.g., the authorization server MAY require a certain URI | values, e.g., the authorization server MAY require a certain URI | |||
prefix or allow only a query parameter to vary at runtime. | prefix or allow only a query parameter to vary at runtime. | |||
Note: The ability to set up transaction specific redirect URIs is | | Note: The ability to set up transaction-specific redirect URIs | |||
also useful in situations where client ids and corresponding | | is also useful in situations where client IDs and corresponding | |||
credentials and policies are managed by a trusted 3rd party, e.g. via | | credentials and policies are managed by a trusted third party, | |||
client certificates containing client permissions. Such an | | e.g., via client certificates containing client permissions. | |||
externally managed client could interact with an authorization server | | Such an externally managed client could interact with an | |||
trusting the respective 3rd party without the need for an additional | | authorization server trusting the respective third party | |||
registration step. | | without the need for an additional registration step. | |||
3. The "request" Request Parameter | 3. The "request" Request Parameter | |||
Clients MAY use the "request" parameter as defined in JAR | Clients MAY use the "request" parameter as defined in JAR [RFC9101] | |||
[I-D.ietf-oauth-jwsreq] to push a request object JWT to the | to push a Request Object JWT to the authorization server. The rules | |||
authorization server. The rules for processing, signing, and | for processing, signing, and encryption of the Request Object as | |||
encryption of the request object as defined in JAR | defined in JAR [RFC9101] apply. Request parameters required by a | |||
[I-D.ietf-oauth-jwsreq] apply. Request parameters required by a | ||||
given client authentication method are included in the "application/ | given client authentication method are included in the "application/ | |||
x-www-form-urlencoded" request directly, and are the only parameters | x-www-form-urlencoded" request directly and are the only parameters | |||
other than "request" in the form body (e.g. Mutual TLS client | other than "request" in the form body (e.g., mutual TLS client | |||
authentication [RFC8705] uses the "client_id" HTTP request parameter | authentication [RFC8705] uses the "client_id" HTTP request parameter, | |||
while JWT assertion based client authentication [RFC7523] uses | while JWT assertion-based client authentication [RFC7523] uses | |||
"client_assertion" and "client_assertion_type"). All other request | "client_assertion" and "client_assertion_type"). All other request | |||
parameters, i.e., those pertaining to the authorization request | parameters, i.e., those pertaining to the authorization request | |||
itself, MUST appear as claims of the JWT representing the | itself, MUST appear as claims of the JWT representing the | |||
authorization request. | authorization request. | |||
The following is an example of a pushed authorization request using a | The following is an example of a pushed authorization request using a | |||
signed request object with the same authorization request payload as | signed Request Object with the same authorization request payload as | |||
the example in Section 2.1. The client is authenticated with JWT | the example in Section 2.1. The client is authenticated with JWT | |||
client assertion based authentication [RFC7523] (extra line breaks | client assertion-based authentication [RFC7523] (extra line breaks | |||
and whitespace for display purposes only): | and spaces for display purposes only): | |||
POST /as/par HTTP/1.1 | POST /as/par HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
client_assertion_type= | client_assertion_type= | |||
urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer | urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer | |||
&client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi | &client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi | |||
OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc | OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc | |||
2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh | 2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh | |||
skipping to change at page 13, line 38 ¶ | skipping to change at line 559 ¶ | |||
BZ0B3VQZ9_KYdPt5bTkaflS5fSDklM3_7my9MyOSKFYmf46INk6ju_qUuC2crkOQX | BZ0B3VQZ9_KYdPt5bTkaflS5fSDklM3_7my9MyOSKFYmf46INk6ju_qUuC2crkOQX | |||
ZWYJB-0bnYEbdHpUjazFSUvN49cEGstNQeE-dKDWHNgEojgcuNA_pjKfL9VYp1dEA | ZWYJB-0bnYEbdHpUjazFSUvN49cEGstNQeE-dKDWHNgEojgcuNA_pjKfL9VYp1dEA | |||
6-WjXZ_OlJ7R_mBWpjFAzc0UkQwqX5hfOJoGTqB2tE4a4aB2z8iYlUJp0DeeYp_hP | 6-WjXZ_OlJ7R_mBWpjFAzc0UkQwqX5hfOJoGTqB2tE4a4aB2z8iYlUJp0DeeYp_hP | |||
N6svtmdvte73p5bLGDFpRIlmrBQIAQuxiS0skORpXlS0cBcgHimXVnXOJG7E-A_lS | N6svtmdvte73p5bLGDFpRIlmrBQIAQuxiS0skORpXlS0cBcgHimXVnXOJG7E-A_lS | |||
_5y54dVLQPA1jKYx-fxbYSG7dp2fw | _5y54dVLQPA1jKYx-fxbYSG7dp2fw | |||
&client_id=s6BhdRkqt3 | &client_id=s6BhdRkqt3 | |||
The authorization server MUST take the following steps beyond the | The authorization server MUST take the following steps beyond the | |||
processing rules defined in Section 2.1: | processing rules defined in Section 2.1: | |||
1. If applicable, decrypt the request object as specified in JAR | 1. If applicable, decrypt the Request Object as specified in JAR | |||
[I-D.ietf-oauth-jwsreq], section 6.1. | [RFC9101], Section 6.1. | |||
2. Validate the request object signature as specified in JAR | 2. Validate the Request Object signature as specified in JAR | |||
[I-D.ietf-oauth-jwsreq], section 6.2. | [RFC9101], Section 6.2. | |||
3. If the client has authentication credentials established with the | 3. If the client has authentication credentials established with the | |||
authorization server, reject the request if the authenticated | authorization server, reject the request if the authenticated | |||
"client_id" does not match the "client_id" claim in the request | "client_id" does not match the "client_id" claim in the Request | |||
object. Additionally requiring the "iss" claim to match the | Object. Additionally, requiring the "iss" claim to match the | |||
"client_id" is at the discretion of authorization server. | "client_id" is at the discretion of the authorization server. | |||
The following RSA key pair, represented in JWK [RFC7517] format, can | The following RSA key pair, represented in JSON Web Key (JWK) format | |||
be used to validate or recreate the request object signature in the | [RFC7517], can be used to validate or recreate the Request Object | |||
above example (extra line breaks and indentation within values for | signature in the above example (extra line breaks and indentation | |||
display purposes only): | within values for display purposes only): | |||
{ | { | |||
"kty": "RSA", | "kty": "RSA", | |||
"kid":"k2bdc", | "kid":"k2bdc", | |||
"n": "y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE | "n": "y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE | |||
5P7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5Oa | 5P7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5Oa | |||
aXDFI6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVj | aXDFI6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVj | |||
dEFgZaZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghL | dEFgZaZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghL | |||
L0HzOuYRadBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUG | L0HzOuYRadBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUG | |||
sqkNA9b3xVW53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw", | sqkNA9b3xVW53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw", | |||
skipping to change at page 14, line 47 ¶ | skipping to change at line 613 ¶ | |||
zpAeYtCT82jxroB2XqhLxGeMxEPQpsz2qTKLSe4BgHY2ml2uxSDGdjcsrbb | zpAeYtCT82jxroB2XqhLxGeMxEPQpsz2qTKLSe4BgHY2ml2uxSDGdjcsrbb | |||
NoKUKaN1CuyZszhWl1n0AT_bENl4bJgQj_Fh0UEsQj5YBBUJt5gr_k", | NoKUKaN1CuyZszhWl1n0AT_bENl4bJgQj_Fh0UEsQj5YBBUJt5gr_k", | |||
"dp": "Zc877jirkkLOtyTs2vxyNe9KnMNAmOidlUc2tE_-0gAL4Lpo1hSwKCtKwe | "dp": "Zc877jirkkLOtyTs2vxyNe9KnMNAmOidlUc2tE_-0gAL4Lpo1hSwKCtKwe | |||
ZJ-gkqt1hT-dwNx_0Xtg_-NXsadMRMwJnzBMYwYAfjApUkfqABc0yUCJJl3 | ZJ-gkqt1hT-dwNx_0Xtg_-NXsadMRMwJnzBMYwYAfjApUkfqABc0yUCJJl3 | |||
KozRCugf1WXkU9GZAH2_x8PUopdNUEa70ISowPRh04HANKX4fkjWAE" | KozRCugf1WXkU9GZAH2_x8PUopdNUEa70ISowPRh04HANKX4fkjWAE" | |||
} | } | |||
4. Authorization Request | 4. Authorization Request | |||
The client uses the "request_uri" value returned by the authorization | The client uses the "request_uri" value returned by the authorization | |||
server to build an authorization request as defined in | server to build an authorization request as defined in [RFC9101]. | |||
[I-D.ietf-oauth-jwsreq]. This is shown in the following example | This is shown in the following example where the client directs the | |||
where the client directs the user agent to make the following HTTP | user agent to make the following HTTP request (extra line breaks and | |||
request (extra line breaks and indentation for display purposes | indentation for display purposes only): | |||
only): | ||||
GET /authorize?client_id=s6BhdRkqt3&request_uri=urn%3Aietf%3Aparams | GET /authorize?client_id=s6BhdRkqt3&request_uri=urn%3Aietf%3Aparams | |||
%3Aoauth%3Arequest_uri%3A6esc_11ACC5bwc014ltc14eY22c HTTP/1.1 | %3Aoauth%3Arequest_uri%3A6esc_11ACC5bwc014ltc14eY22c HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Since parts of the authorization request content, e.g. the | Since parts of the authorization request content, e.g., the | |||
"code_challenge" parameter value, are unique to a particular | "code_challenge" parameter value, are unique to a particular | |||
authorization request, the client MUST only use a "request_uri" value | authorization request, the client MUST only use a "request_uri" value | |||
once. Authorization servers SHOULD treat "request_uri" values as | once. Authorization servers SHOULD treat "request_uri" values as | |||
one-time use but MAY allow for duplicate requests due to a user | one-time use but MAY allow for duplicate requests due to a user | |||
reloading/refreshing their user agent. An expired "request_uri" MUST | reloading/refreshing their user agent. An expired "request_uri" MUST | |||
be rejected as invalid. | be rejected as invalid. | |||
The authorization server MUST validate authorization requests arising | The authorization server MUST validate authorization requests arising | |||
from a pushed request as it would any other authorization request. | from a pushed request as it would any other authorization request. | |||
The authorization server MAY omit validation steps that it performed | The authorization server MAY omit validation steps that it performed | |||
when the request was pushed, provided that it can validate that the | when the request was pushed, provided that it can validate that the | |||
request was a pushed request, and that the request or the | request was a pushed request and that the request or the | |||
authorization server's policy has not been modified in a way that | authorization server's policy has not been modified in a way that | |||
would affect the outcome of the omitted steps. | would affect the outcome of the omitted steps. | |||
Authorization server policy MAY dictate, either globally or on a per- | Authorization server policy MAY dictate, either globally or on a per- | |||
client basis, that PAR is the only means for a client to pass | client basis, that PAR be the only means for a client to pass | |||
authorization request data. In this case, the authorization server | authorization request data. In this case, the authorization server | |||
will refuse, using the "invalid_request" error code, to process any | will refuse, using the "invalid_request" error code, to process any | |||
request to the authorization endpoint that does not have a | request to the authorization endpoint that does not have a | |||
"request_uri" parameter with a value obtained from the PAR endpoint. | "request_uri" parameter with a value obtained from the PAR endpoint. | |||
Note: authorization server and clients MAY use metadata as defined in | | Note: Authorization server and clients MAY use metadata as | |||
Section 5 and Section 6 to signal the desired behavior. | | defined in Sections 5 and 6 to signal the desired behavior. | |||
5. Authorization Server Metadata | 5. Authorization Server Metadata | |||
The following authorization server metadata [RFC8414] parameters are | The following authorization server metadata parameters [RFC8414] are | |||
introduced to signal the server's capability and policy with respect | introduced to signal the server's capability and policy with respect | |||
to PAR. | to PAR. | |||
"pushed_authorization_request_endpoint" The URL of the pushed | pushed_authorization_request_endpoint | |||
authorization request endpoint at which a client can post an | The URL of the pushed authorization request endpoint at which a | |||
authorization request to exchange for a "request_uri" value usable | client can post an authorization request to exchange for a | |||
at the authorization server. | "request_uri" value usable at the authorization server. | |||
"require_pushed_authorization_requests" Boolean parameter indicating | require_pushed_authorization_requests | |||
whether the authorization server accepts authorization request | Boolean parameter indicating whether the authorization server | |||
data only via PAR. If omitted, the default value is "false". | accepts authorization request data only via PAR. If omitted, the | |||
default value is "false". | ||||
Note that the presence of "pushed_authorization_request_endpoint" is | Note that the presence of "pushed_authorization_request_endpoint" is | |||
sufficient for a client to determine that it may use the PAR flow. A | sufficient for a client to determine that it may use the PAR flow. A | |||
"request_uri" value obtained from the PAR endpoint is usable at the | "request_uri" value obtained from the PAR endpoint is usable at the | |||
authorization endpoint regardless of other authorization server | authorization endpoint regardless of other authorization server | |||
metadata such as "request_uri_parameter_supported" or | metadata such as "request_uri_parameter_supported" or | |||
"require_request_uri_registration" [OIDC.Disco]. | "require_request_uri_registration" [OIDC.Disco]. | |||
6. Client Metadata | 6. Client Metadata | |||
skipping to change at page 16, line 21 ¶ | skipping to change at line 684 ¶ | |||
dynamically registering OAuth 2.0 client metadata with authorization | dynamically registering OAuth 2.0 client metadata with authorization | |||
servers. The metadata defined by [RFC7591], and registered | servers. The metadata defined by [RFC7591], and registered | |||
extensions to it, also imply a general data model for clients that is | extensions to it, also imply a general data model for clients that is | |||
useful for authorization server implementations even when the Dynamic | useful for authorization server implementations even when the Dynamic | |||
Client Registration Protocol isn't in play. Such implementations | Client Registration Protocol isn't in play. Such implementations | |||
will typically have some sort of user interface available for | will typically have some sort of user interface available for | |||
managing client configuration. The following client metadata | managing client configuration. The following client metadata | |||
parameter is introduced by this document to indicate whether pushed | parameter is introduced by this document to indicate whether pushed | |||
authorization requests are required for the given client. | authorization requests are required for the given client. | |||
"require_pushed_authorization_requests" Boolean parameter indicating | require_pushed_authorization_requests | |||
whether the only means of initiating an authorization request the | Boolean parameter indicating whether the only means of initiating | |||
client is allowed to use is PAR. If omitted, the default value is | an authorization request the client is allowed to use is PAR. If | |||
"false". | omitted, the default value is "false". | |||
7. Security Considerations | 7. Security Considerations | |||
7.1. Request URI Guessing | 7.1. Request URI Guessing | |||
An attacker could attempt to guess and replay a valid request URI | An attacker could attempt to guess and replay a valid request URI | |||
value and try to impersonate the respective client. The | value and try to impersonate the respective client. The | |||
authorization server MUST consider the considerations given in JAR | authorization server MUST account for the considerations given in JAR | |||
[I-D.ietf-oauth-jwsreq], section 10.2, clause (d) on request URI | [RFC9101], Section 10.2, clause (d) on request URI entropy. | |||
entropy. | ||||
7.2. Open Redirection | 7.2. Open Redirection | |||
An attacker could try to register a redirect URI pointing to a site | An attacker could try to register a redirect URI pointing to a site | |||
under his control in order to obtain authorization codes or launch | under their control in order to obtain authorization codes or launch | |||
other attacks towards the user. The authorization server MUST only | other attacks towards the user. The authorization server MUST only | |||
accept new redirect URIs in the pushed authorization request from | accept new redirect URIs in the pushed authorization request from | |||
authenticated clients. | authenticated clients. | |||
7.3. Request Object Replay | 7.3. Request Object Replay | |||
An attacker could replay a request URI captured from a legitimate | An attacker could replay a request URI captured from a legitimate | |||
authorization request. In order to cope with such attacks, the | authorization request. In order to cope with such attacks, the | |||
authorization server SHOULD make the request URIs one-time use. | authorization server SHOULD make the request URIs one-time use. | |||
7.4. Client Policy Change | 7.4. Client Policy Change | |||
The client policy might change between the lodging of the request | The client policy might change between the lodging of the Request | |||
object and the authorization request using a particular request | Object and the authorization request using a particular Request | |||
object. It is therefore recommended that the authorization server | Object. Therefore, it is recommended that the authorization server | |||
check the request parameter against the client policy when processing | check the request parameter against the client policy when processing | |||
the authorization request. | the authorization request. | |||
7.5. Request URI Swapping | 7.5. Request URI Swapping | |||
An attacker could capture the request URI from one request and then | An attacker could capture the request URI from one request and then | |||
substitute it into a different authorization request. For example, | substitute it into a different authorization request. For example, | |||
in the context of OpenID Connect, an attacker could replace a request | in the context of OpenID Connect, an attacker could replace a request | |||
URI asking for a high level of authentication assurance with one that | URI asking for a high level of authentication assurance with one that | |||
requires a lower level of assurance. Clients SHOULD make use of PKCE | requires a lower level of assurance. Clients SHOULD make use of PKCE | |||
[RFC7636], a unique "state" parameter [RFC6749], or the OIDC "nonce" | [RFC7636], a unique "state" parameter [RFC6749], or the OIDC "nonce" | |||
parameter [OIDC] in the pushed request object to prevent this attack. | parameter [OIDC] in the pushed Request Object to prevent this attack. | |||
8. Privacy Considerations | 8. Privacy Considerations | |||
OAuth 2.0 is a complex and flexible framework with broad-ranging | OAuth 2.0 is a complex and flexible framework with broad-ranging | |||
privacy implications due to the very nature of it having one entity | privacy implications due to its very nature of having one entity | |||
intermediate user authorization to data access between two other | intermediate user authorization to data access between two other | |||
entities. The privacy considerations of all of OAuth are beyond the | entities. The privacy considerations of all of OAuth are beyond the | |||
scope of this document, which only defines an alternative way of | scope of this document, which only defines an alternative way of | |||
initiating one message sequence in the larger framework. Using PAR, | initiating one message sequence in the larger framework. However, | |||
however, may improve privacy by reducing the potential for | using PAR may improve privacy by reducing the potential for | |||
inadvertent information disclosure since it passes the authorization | inadvertent information disclosure since it passes the authorization | |||
request data directly between client and authorization server over a | request data directly between the client and authorization server | |||
secure connection in the message body of an HTTP request, rather than | over a secure connection in the message body of an HTTP request | |||
in the query component of a URL that passes through the user agent in | rather than in the query component of a URL that passes through the | |||
the clear. | user agent in the clear. | |||
9. Acknowledgements | ||||
This specification is based on the work towards Pushed Request Object | ||||
(https://bitbucket.org/openid/fapi/src/master/ | ||||
Financial_API_Pushed_Request_Object.md) conducted at the Financial- | ||||
grade API working group at the OpenID Foundation. We would like to | ||||
thank the members of the WG for their valuable contributions. | ||||
We would like to thank Vladimir Dzhuvinov, Aaron Parecki, Justin | ||||
Richer, Sascha Preibisch, Daniel Fett, Michael B. Jones, Annabelle | ||||
Backman, Joseph Heenan, Sean Glencross, Maggie Hung, Neil Madden, | ||||
Karsten Meyer zu Selhausen, Roman Danyliw, Meral Shirazipour, and | ||||
Takahiko Kawasaki for their valuable feedback on this draft. | ||||
10. IANA Considerations | 9. IANA Considerations | |||
10.1. OAuth Authorization Server Metadata | 9.1. OAuth Authorization Server Metadata | |||
This specification requests registration of the following values in | IANA has registered the following values in the IANA "OAuth | |||
the IANA "OAuth Authorization Server Metadata" registry of | Authorization Server Metadata" registry of [IANA.OAuth.Parameters] | |||
[IANA.OAuth.Parameters] established by [RFC8414]. | established by [RFC8414]. | |||
Metadata Name: "pushed_authorization_request_endpoint" | Metadata Name: "pushed_authorization_request_endpoint" | |||
Metadata Description: URL of the authorization server's pushed | Metadata Description: URL of the authorization server's pushed | |||
authorization request endpoint | authorization request endpoint. | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): Section 5 of [[ this document ]] | Specification Document(s): Section 5 of RFC 9126 | |||
Metadata Name: "require_pushed_authorization_requests" | Metadata Name: "require_pushed_authorization_requests" | |||
Metadata Description: Indicates whether the authorization server | Metadata Description: Indicates whether the authorization server | |||
accepts authorization requests only via PAR. | accepts authorization requests only via PAR. | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): Section 5 of [[ this document ]] | Specification Document(s): Section 5 of RFC 9126 | |||
10.2. OAuth Dynamic Client Registration Metadata | 9.2. OAuth Dynamic Client Registration Metadata | |||
This specification requests registration of the following value in | IANA has registered the following value in the IANA "OAuth Dynamic | |||
the IANA "OAuth Dynamic Client Registration Metadata" registry of | Client Registration Metadata" registry of [IANA.OAuth.Parameters] | |||
[IANA.OAuth.Parameters] established by [RFC7591]. | established by [RFC7591]. | |||
Client Metadata Name: "require_pushed_authorization_requests" | Client Metadata Name: "require_pushed_authorization_requests" | |||
Client Metadata Description: Indicates whether the client is | Client Metadata Description: Indicates whether the client is | |||
required to use the PAR to initiate authorization requests. | required to use PAR to initiate authorization requests. | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): Section 6 of [[ this document ]] | Specification Document(s): Section 6 of RFC 9126 | |||
10.3. OAuth URI Registration | 9.3. OAuth URI Registration | |||
This specification requests registration of the following value in | IANA has registered the following value in the "OAuth URI" registry | |||
the "OAuth URI" registry of [IANA.OAuth.Parameters] established by | of [IANA.OAuth.Parameters] established by [RFC6755]. | |||
[RFC6755]. | ||||
URN: "urn:ietf:params:oauth:request_uri:" | URN: "urn:ietf:params:oauth:request_uri:" | |||
Common Name: A URN Sub-Namespace for OAuth Request URIs. | Common Name: A URN Sub-Namespace for OAuth Request URIs. | |||
Change Controller: IESG | Change Controller: IESG | |||
Specification Document(s): Section 2.2 of [[ this document ]] | Specification Document(s): Section 2.2 of RFC 9126 | |||
11. Normative References | 10. References | |||
[I-D.ietf-oauth-jwsreq] | 10.1. Normative References | |||
Sakimura, N., Bradley, J., and M. B. Jones, "The OAuth 2.0 | ||||
Authorization Framework: JWT Secured Authorization Request | ||||
(JAR)", Work in Progress, Internet-Draft, draft-ietf- | ||||
oauth-jwsreq-34, 8 April 2021, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-oauth- | ||||
jwsreq-34>. | ||||
[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>. | |||
[RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", | [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", | |||
RFC 6749, DOI 10.17487/RFC6749, October 2012, | RFC 6749, DOI 10.17487/RFC6749, October 2012, | |||
<https://www.rfc-editor.org/info/rfc6749>. | <https://www.rfc-editor.org/info/rfc6749>. | |||
skipping to change at page 19, line 32 ¶ | skipping to change at line 814 ¶ | |||
[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>. | |||
12. Informative References | [RFC9101] Sakimura, N., Bradley, J., and M. Jones, "The OAuth 2.0 | |||
Authorization Framework: JWT-Secured Authorization Request | ||||
(JAR)", RFC 9101, DOI 10.17487/RFC9101, August 2021, | ||||
<https://www.rfc-editor.org/info/rfc9101>. | ||||
[I-D.ietf-oauth-security-topics] | 10.2. Informative References | |||
[IANA.OAuth.Parameters] | ||||
IANA, "OAuth Parameters", | ||||
<http://www.iana.org/assignments/oauth-parameters>. | ||||
[OAUTH-SECURITY-TOPICS] | ||||
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, | Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, | |||
"OAuth 2.0 Security Best Current Practice", Work in | "OAuth 2.0 Security Best Current Practice", Work in | |||
Progress, Internet-Draft, draft-ietf-oauth-security- | Progress, Internet-Draft, draft-ietf-oauth-security- | |||
topics-18, 13 April 2021, | topics-18, 13 April 2021, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-oauth- | <https://datatracker.ietf.org/doc/html/draft-ietf-oauth- | |||
security-topics-18>. | security-topics-18>. | |||
[I-D.ietf-oauth-v2-1] | [OAUTH-V2] Hardt, D., Parecki, A., and T. Lodderstedt, "The OAuth 2.1 | |||
Hardt, D., Parecki, A., and T. Lodderstedt, "The OAuth 2.1 | ||||
Authorization Framework", Work in Progress, Internet- | Authorization Framework", Work in Progress, Internet- | |||
Draft, draft-ietf-oauth-v2-1-02, 15 March 2021, | Draft, draft-ietf-oauth-v2-1-03, 8 September 2021, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-oauth- | <https://datatracker.ietf.org/doc/html/draft-ietf-oauth- | |||
v2-1-02>. | v2-1-03>. | |||
[IANA.OAuth.Parameters] | ||||
IANA, "OAuth Parameters", | ||||
<http://www.iana.org/assignments/oauth-parameters>. | ||||
[OIDC] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and | [OIDC] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and | |||
C. Mortimore, "OpenID Connect Core 1.0 incorporating | C. Mortimore, "OpenID Connect Core 1.0 incorporating | |||
errata set 1", 8 November 2014, | errata set 1", November 2014, | |||
<http://openid.net/specs/openid-connect-core-1_0.html>. | <http://openid.net/specs/openid-connect-core-1_0.html>. | |||
[OIDC.Disco] | [OIDC.Disco] | |||
Sakimura, N., Bradley, J., Jones, M.B., and E. Jay, | Sakimura, N., Bradley, J., Jones, M., and E. Jay, "OpenID | |||
"OpenID Connect Discovery 1.0", 8 November 2014, | Connect Discovery 1.0 incorporating errata set 1", | |||
<http://openid.net/specs/openid-connect-discovery- | November 2014, <http://openid.net/specs/openid-connect- | |||
1_0.html>. | discovery-1_0.html>. | |||
[RFC6755] Campbell, B. and H. Tschofenig, "An IETF URN Sub-Namespace | [RFC6755] Campbell, B. and H. Tschofenig, "An IETF URN Sub-Namespace | |||
for OAuth", RFC 6755, DOI 10.17487/RFC6755, October 2012, | for OAuth", RFC 6755, DOI 10.17487/RFC6755, October 2012, | |||
<https://www.rfc-editor.org/info/rfc6755>. | <https://www.rfc-editor.org/info/rfc6755>. | |||
[RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | [RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | |||
DOI 10.17487/RFC7517, May 2015, | DOI 10.17487/RFC7517, May 2015, | |||
<https://www.rfc-editor.org/info/rfc7517>. | <https://www.rfc-editor.org/info/rfc7517>. | |||
[RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | |||
skipping to change at page 21, line 9 ¶ | skipping to change at line 891 ¶ | |||
[RFC8705] Campbell, B., Bradley, J., Sakimura, N., and T. | [RFC8705] Campbell, B., Bradley, J., Sakimura, N., and T. | |||
Lodderstedt, "OAuth 2.0 Mutual-TLS Client Authentication | Lodderstedt, "OAuth 2.0 Mutual-TLS Client Authentication | |||
and Certificate-Bound Access Tokens", RFC 8705, | and Certificate-Bound Access Tokens", RFC 8705, | |||
DOI 10.17487/RFC8705, February 2020, | DOI 10.17487/RFC8705, February 2020, | |||
<https://www.rfc-editor.org/info/rfc8705>. | <https://www.rfc-editor.org/info/rfc8705>. | |||
[RFC8707] Campbell, B., Bradley, J., and H. Tschofenig, "Resource | [RFC8707] Campbell, B., Bradley, J., and H. Tschofenig, "Resource | |||
Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707, | Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707, | |||
February 2020, <https://www.rfc-editor.org/info/rfc8707>. | February 2020, <https://www.rfc-editor.org/info/rfc8707>. | |||
Appendix A. Document History | Acknowledgements | |||
[[ To be removed from the final specification ]] | ||||
-10 | ||||
* Updates from mistakenly overlooked IESG evaluation comments | ||||
-09 | ||||
* Editorial fixes from Genart last call review | ||||
* Updates from IESG evaluation comments | ||||
-08 | ||||
* Updates to address feedback from AD Review | ||||
https://mailarchive.ietf.org/arch/msg/oauth/ | ||||
bGSyonUqsvJ1vtY7l_ohwov25SA/ | ||||
(https://mailarchive.ietf.org/arch/msg/oauth/ | ||||
bGSyonUqsvJ1vtY7l_ohwov25SA/) | ||||
-07 | ||||
* updated references (however they did not actually update due to | ||||
tooling issues - some info in this thread: | ||||
https://mailarchive.ietf.org/arch/msg/xml2rfc/ | ||||
zqYiMxZ070SCIi7CRNF9vbDeYno/ | ||||
(https://mailarchive.ietf.org/arch/msg/xml2rfc/ | ||||
zqYiMxZ070SCIi7CRNF9vbDeYno/) ) | ||||
-06 | ||||
* Add a note clarifying that the presence of | ||||
"pushed_authorization_request_endpoint" is sufficient for a client | ||||
to know that it can use the PAR flow | ||||
-05 | ||||
* Mention use of "invalid_request" error code for cases, like a bad | ||||
"redirect_uri", that don't have a more specific one | ||||
-04 | ||||
* Edits to address WGLC comments | ||||
* Replace I-D.ietf-oauth-mtls reference with now published RFC8705 | ||||
* Moved text about redirect URI management from introduction into | ||||
separate section | ||||
-03 | ||||
* Editorial updates | ||||
* Mention that https is required for the PAR endpoint | ||||
* Add some discussion of browser form posting an authz request vs. | ||||
the benefits of PAR for any application | ||||
* Added text about motivations behind PAR - integrity, | ||||
confidentiality and early client auth | ||||
* Better explain one-time use recommendation of the request_uri | ||||
* Drop the section on special error responses for request objects | ||||
* Clarify authorization request examples to say that the client | ||||
directs the user agent to make the HTTP GET request (vs. making | ||||
the request itself) | ||||
-02 | ||||
* Update Resource Indicators reference to the somewhat recently | ||||
published RFC 8707 | ||||
* Added metadata in support of pushed authorization requests only | ||||
feature | ||||
* Update to comply with draft-ietf-oauth-jwsreq-21, which requires | ||||
"client_id" in the authorization request in addition to the | ||||
"request_uri" | ||||
* Clarified timing of request validation | ||||
* Add some guidance/options on the request URI structure | ||||
* Add the key used in the request object example so that a reader | ||||
could validate or recreate the request object signature | ||||
* Update to draft-ietf-oauth-jwsreq-25 and added note regarding | ||||
"require_signed_request_object" | ||||
-01 | ||||
* Use the newish RFC v3 XML and HTML format | ||||
* Added IANA registration request for | ||||
"pushed_authorization_request_endpoint" | ||||
* Changed abbrev to "OAuth PAR" | ||||
-00 (WG draft) | ||||
* Reference RFC6749 sec 2.3.1 for client secret basic rather than | ||||
RFC7617 | ||||
* further clarify that a request object JWT contains all the | ||||
authorization request parameters while client authentication | ||||
params, if applicable, are outside that JWT as regular form | ||||
encoded params in HTTP body | ||||
-01 | ||||
* List "client_id" as one of the basic parameters | ||||
* Explicitly forbid "request_uri" in the processing rules | ||||
* Clarification regarding client authentication and that public | ||||
clients are allowed | ||||
* Added option to let clients register per-authorization request | ||||
redirect URIs | ||||
* General clean up and wording improvements | ||||
-00 | This specification is based on the work on Pushed Request Object | |||
(https://bitbucket.org/openid/fapi/src/master/ | ||||
Financial_API_Pushed_Request_Object.md) conducted at the Financial- | ||||
grade API Working Group at the OpenID Foundation. We would like to | ||||
thank the members of the WG for their valuable contributions. | ||||
* first draft | We would like to thank Vladimir Dzhuvinov, Aaron Parecki, Justin | |||
Richer, Sascha Preibisch, Daniel Fett, Michael B. Jones, Annabelle | ||||
Backman, Joseph Heenan, Sean Glencross, Maggie Hung, Neil Madden, | ||||
Karsten Meyer zu Selhausen, Roman Danyliw, Meral Shirazipour, and | ||||
Takahiko Kawasaki for their valuable feedback on this document. | ||||
Authors' Addresses | Authors' Addresses | |||
Torsten Lodderstedt | Torsten Lodderstedt | |||
yes.com | yes.com | |||
Email: torsten@lodderstedt.net | Email: torsten@lodderstedt.net | |||
Brian Campbell | Brian Campbell | |||
Ping Identity | Ping Identity | |||
End of changes. 90 change blocks. | ||||
398 lines changed or deleted | 272 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/ |