| < draft-ietf-oauth-v2-10.txt | draft-ietf-oauth-v2-11.txt > | |||
|---|---|---|---|---|
| Network Working Group E. Hammer-Lahav, Ed. | Network Working Group E. Hammer-Lahav, Ed. | |||
| Internet-Draft Yahoo! | Internet-Draft Yahoo! | |||
| Obsoletes: 5849 (if approved) D. Recordon | Obsoletes: 5849 (if approved) D. Recordon | |||
| Intended status: Standards Track Facebook | Intended status: Standards Track Facebook | |||
| Expires: January 12, 2011 D. Hardt | Expires: June 4, 2011 D. Hardt | |||
| Microsoft | Microsoft | |||
| July 11, 2010 | December 1, 2010 | |||
| The OAuth 2.0 Protocol | The OAuth 2.0 Protocol Framework | |||
| draft-ietf-oauth-v2-10 | draft-ietf-oauth-v2-11 | |||
| Abstract | Abstract | |||
| This specification describes the OAuth 2.0 protocol. | This specification describes the OAuth 2.0 protocol framework. | |||
| Status of this Memo | Status of this Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on January 12, 2011. | This Internet-Draft will expire on June 4, 2011. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2010 IETF Trust and the persons identified as the | Copyright (c) 2010 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 | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://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 | |||
| skipping to change at page 2, line 11 ¶ | skipping to change at page 2, line 11 ¶ | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 5 | 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 1.3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 1.4. Client Profiles . . . . . . . . . . . . . . . . . . . . . 10 | 1.4. Access Grants . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 1.4.1. Web Server . . . . . . . . . . . . . . . . . . . . . . 10 | 1.4.1. Authorization Code . . . . . . . . . . . . . . . . . . 8 | |||
| 1.4.2. User-Agent . . . . . . . . . . . . . . . . . . . . . . 11 | 1.4.2. Resource Owner Password Credentials . . . . . . . . . 10 | |||
| 1.4.3. Native Application . . . . . . . . . . . . . . . . . . 13 | 1.4.3. Client Credentials . . . . . . . . . . . . . . . . . . 10 | |||
| 1.4.4. Autonomous . . . . . . . . . . . . . . . . . . . . . . 14 | 1.4.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 11 | |||
| 2. Client Credentials . . . . . . . . . . . . . . . . . . . . . . 14 | 1.4.5. Assertion . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 2.1. Client Password Credentials . . . . . . . . . . . . . . . 15 | 2. Client Profiles . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3. Obtaining End-User Authorization . . . . . . . . . . . . . . . 16 | 2.1. Web Server . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.1. Authorization Response . . . . . . . . . . . . . . . . . . 18 | 2.2. User-Agent . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.2. Error Response . . . . . . . . . . . . . . . . . . . . . . 20 | 2.3. Native Application . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.2.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 21 | 2.4. Autonomous . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 21 | 3. Client Credentials . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.1. Access Grant Types . . . . . . . . . . . . . . . . . . . . 23 | 3.1. Client Password Credentials . . . . . . . . . . . . . . . 17 | |||
| 4.1.1. Authorization Code . . . . . . . . . . . . . . . . . . 23 | 3.2. Client Assertion Credentials . . . . . . . . . . . . . . . 18 | |||
| 4.1.2. Resource Owner Password Credentials . . . . . . . . . 24 | 4. Obtaining End-User Authorization . . . . . . . . . . . . . . . 20 | |||
| 4.1.3. Assertion . . . . . . . . . . . . . . . . . . . . . . 24 | 4.1. Authorization Request . . . . . . . . . . . . . . . . . . 20 | |||
| 4.1.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 25 | 4.2. Authorization Response . . . . . . . . . . . . . . . . . . 22 | |||
| 4.2. Access Token Response . . . . . . . . . . . . . . . . . . 26 | 4.3. Error Response . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 4.3. Error Response . . . . . . . . . . . . . . . . . . . . . . 27 | 4.3.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 4.3.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 28 | 5. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 25 | |||
| 5. Accessing a Protected Resource . . . . . . . . . . . . . . . . 29 | 5.1. Access Grant Types . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.1. Authenticated Requests . . . . . . . . . . . . . . . . . . 29 | 5.1.1. Authorization Code . . . . . . . . . . . . . . . . . . 27 | |||
| 5.1.1. The Authorization Request Header Field . . . . . . . . 30 | 5.1.2. Resource Owner Password Credentials . . . . . . . . . 27 | |||
| 5.1.2. URI Query Parameter . . . . . . . . . . . . . . . . . 30 | 5.1.3. Client Credentials . . . . . . . . . . . . . . . . . . 28 | |||
| 5.1.3. Form-Encoded Body Parameter . . . . . . . . . . . . . 31 | 5.1.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.2. The WWW-Authenticate Response Header Field . . . . . . . . 32 | 5.1.5. Assertion . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 5.2.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 33 | 5.2. Access Token Response . . . . . . . . . . . . . . . . . . 30 | |||
| 6. Extensibility . . . . . . . . . . . . . . . . . . . . . . . . 34 | 5.3. Error Response . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 6.1. Defining New Client Credentials Types . . . . . . . . . . 34 | 5.3.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 6.2. Defining New Endpoint Parameters . . . . . . . . . . . . . 34 | 6. Accessing a Protected Resource . . . . . . . . . . . . . . . . 33 | |||
| 6.3. Defining New Header Field Parameters . . . . . . . . . . . 35 | 6.1. Access Token Types . . . . . . . . . . . . . . . . . . . . 33 | |||
| 6.4. Defining New Access Grant Types . . . . . . . . . . . . . 35 | 6.2. The WWW-Authenticate Response Header Field . . . . . . . . 33 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 35 | 6.2.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 | 7. Extensibility . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 8.1. The OAuth Parameters Registry . . . . . . . . . . . . . . 35 | 7.1. Defining New Client Credentials Types . . . . . . . . . . 36 | |||
| 8.1.1. Registration Template . . . . . . . . . . . . . . . . 36 | 7.2. Defining New Endpoint Parameters . . . . . . . . . . . . . 36 | |||
| 8.1.2. Example . . . . . . . . . . . . . . . . . . . . . . . 36 | 7.3. Defining New Header Field Parameters . . . . . . . . . . . 36 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 37 | 7.4. Defining New Access Grant Types . . . . . . . . . . . . . 37 | |||
| Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 37 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | |||
| Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . . 37 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | |||
| Appendix D. Document History . . . . . . . . . . . . . . . . . . 38 | 9.1. The OAuth Parameters Registry . . . . . . . . . . . . . . 37 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | 9.1.1. Registration Template . . . . . . . . . . . . . . . . 37 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . . 42 | 9.1.2. Example . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . . 43 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 43 | Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 38 | |||
| Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . . 39 | ||||
| Appendix D. Document History . . . . . . . . . . . . . . . . . . 39 | ||||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | ||||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . . 44 | ||||
| 10.2. Informative References . . . . . . . . . . . . . . . . . . 45 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
| 1. Introduction | 1. Introduction | |||
| With the increasing use of distributed web services and cloud | With the increasing use of distributed web services and cloud | |||
| computing, third-party applications require access to server-hosted | computing, third-party applications require access to server-hosted | |||
| resources. These resources are usually protected and require | resources. These resources are usually protected and require | |||
| authentication using the resource owner's credentials (typically a | authentication using the resource owner's credentials (typically a | |||
| username and password). | username and password). | |||
| In the traditional client-server authentication model, the client | In the traditional client-server authentication model, the client | |||
| accesses a protected resource on the server by authenticating with | accesses a protected resource on the server by authenticating with | |||
| the server using the resource owner's credentials. In order to | the server using the resource owner's credentials. In order to | |||
| provide third-party applications access to protected resources, the | provide third-party applications access to protected resources, the | |||
| resource owner shares its credentials with the third-party. This | resource owner shares its credentials with the third-party. This | |||
| creates several problems and limitations: | creates several problems and limitations: | |||
| o Third-party applications are required to store the resource- | o Third-party applications are required to store the resource- | |||
| owner's credentials for future use, typically a password in clear- | owner's credentials for future use, typically a password in clear- | |||
| text. | text. | |||
| o Servers are required to support password (symmetric) | o Servers are required to support password authentication, despite | |||
| authentication, despite the security weaknesses created by | the security weaknesses created by passwords. | |||
| passwords. | ||||
| o Third-party applications gain overly broad access to the resource- | o Third-party applications gain overly broad access to the resource- | |||
| owner's protected resources, leaving resource owners without any | owner's protected resources, leaving resource owners without any | |||
| ability to restrict access to a limited subset of resources, to | ability to restrict access to a limited subset of resources, to | |||
| limit access duration, or to limit access to the methods supported | limit access duration, or to limit access to the methods supported | |||
| by these resources. | by these resources. | |||
| o Resource owners cannot revoke access to an individual third-party | o Resource owners cannot revoke access to an individual third-party | |||
| without revoking access to all third-parties, and must do so by | without revoking access to all third-parties, and must do so by | |||
| changing their password. | changing their password. | |||
| OAuth address these issues by separating the role of the client from | OAuth addresses these issues by separating the role of the client | |||
| that of the resource owner. In OAuth, the client (which is usually | from that of the resource owner. In OAuth, the client (which is | |||
| not the resource owner, but is acting on the resource owner's behalf) | usually not the resource owner, but is acting on the resource owner's | |||
| requests access to resources controlled by the resource owner and | behalf) requests access to resources controlled by the resource owner | |||
| hosted by the resource server, and is issued a different set of | and hosted by the resource server, and is issued a different set of | |||
| credentials than those of the resource owner. | credentials than those of the resource owner. | |||
| Instead of using the resource owner's credentials to access protected | Instead of using the resource owner's credentials to access protected | |||
| resources, clients obtain an access token (a string which denotes a | resources, the client obtains an access token - a string which | |||
| specific scope, duration, and other attributes). The format and | denotes a specific scope, duration, and other attributes. Access | |||
| structure of access tokens is beyond the scope of this specification. | tokens are issued to third-party clients by an authorization server | |||
| Tokens are issued to third-party clients by an authorization server | ||||
| with the approval of the resource owner. The client uses the access | with the approval of the resource owner. The client uses the access | |||
| token to access the protected resources hosted by the resource | token to access the protected resources hosted by the resource | |||
| server. The interaction between the authorization server and | server. | |||
| resource server is beyond the scope of this specification. | ||||
| For example, a web user (resource owner) can grant a printing service | For example, a web user (resource owner) can grant a printing service | |||
| (client) access to her protected photos stored at a photo sharing | (client) access to her protected photos stored at a photo sharing | |||
| service (resource server), without sharing her username and password | service (resource server), without sharing her username and password | |||
| with the printing service. Instead, she authenticates directly with | with the printing service. Instead, she authenticates directly with | |||
| an authentication service trusted by the photo sharing service | an authentication service trusted by the photo sharing service | |||
| (authorization server) which issues the printing service delegation- | (authorization server) which issues the printing service delegation- | |||
| specific credentials (token). | specific credentials (token). | |||
| This specification defines the use of OAuth over HTTP [RFC2616] (or | Access tokens can have different formats, structures, and methods of | |||
| HTTP over TLS as defined by [RFC2818]). Other specifications may | utilization (e.g. cryptographic properties), based on the resource | |||
| extend it for use with other transport protocols. | server security requirements. Access token attributes and the | |||
| methods used to access protected resources are beyond the scope of | ||||
| this specification and are defined by companion specifications. The | ||||
| interaction between the authorization server and resource server is | ||||
| beyond the scope of this specification. | ||||
| 1.1. Notational Conventions | 1.1. Notational Conventions | |||
| The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', | |||
| 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', and 'OPTIONAL' in this | 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', and 'OPTIONAL' in this | |||
| document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
| This document uses the Augmented Backus-Naur Form (ABNF) notation of | This document uses the Augmented Backus-Naur Form (ABNF) notation of | |||
| [I-D.ietf-httpbis-p1-messaging]. Additionally, the following rules | [I-D.ietf-httpbis-p1-messaging]. Additionally, the following rules | |||
| are included from [RFC2617]: realm, auth-param; from [RFC3986]: URI- | are included from [RFC3986]: URI-reference; and from | |||
| Reference; and from [I-D.ietf-httpbis-p1-messaging]: OWS, RWS, and | [I-D.ietf-httpbis-p1-messaging]: OWS, RWS, and quoted-string. | |||
| quoted-string. | ||||
| Unless otherwise noted, all the protocol parameter names and values | Unless otherwise noted, all the protocol parameter names and values | |||
| are case sensitive. | are case sensitive. | |||
| 1.2. Terminology | 1.2. Terminology | |||
| protected resource | protected resource | |||
| An access-restricted resource which can be obtained using an | An access-restricted resource which can be obtained using an | |||
| OAuth-authenticated request. | OAuth-authenticated request. | |||
| skipping to change at page 6, line 29 ¶ | skipping to change at page 6, line 29 ¶ | |||
| token. | token. | |||
| access token | access token | |||
| A token used by the client to make authenticated requests on | A token used by the client to make authenticated requests on | |||
| behalf of the resource owner. | behalf of the resource owner. | |||
| refresh token | refresh token | |||
| A token used by the client to obtain a new access token without | A token used by the client to obtain a new access token without | |||
| having to involve the resource owner. | having to involve the resource owner. | |||
| authorization code A short-lived token representing the access grant | authorization code A short-lived token representing the | |||
| provided by the end-user. The authorization code is used to | authorization provided by the end-user. The authorization code | |||
| obtain an access token and a refresh token. | is used to obtain an access token and a refresh token. | |||
| access grant A general term used to describe the intermediate | ||||
| credentials (such as an end-user password or authorization | ||||
| code) representing the resource owner authorization. Access | ||||
| grants are used by the client to obtain an access token. By | ||||
| exchanging access grants of different types for an access | ||||
| token, the resource server is only required to support a single | ||||
| authentication scheme. | ||||
| authorization server | authorization server | |||
| A server capable of issuing tokens after successfully | A server capable of issuing tokens after successfully | |||
| authenticating the resource owner and obtaining authorization. | authenticating the resource owner and obtaining authorization. | |||
| The authorization server may be the same server as the resource | The authorization server may be the same server as the resource | |||
| server, or a separate entity. | server, or a separate entity. A single authorization server | |||
| may issue tokens for multiple resource servers. | ||||
| end-user authorization endpoint | end-user authorization endpoint | |||
| The authorization server's HTTP endpoint capable of | The authorization server's HTTP endpoint capable of | |||
| authenticating the end-user and obtaining authorization. The | authenticating the end-user and obtaining authorization. The | |||
| end-user authorization endpoint is described in Section 3. | end-user authorization endpoint is described in Section 4. | |||
| token endpoint | token endpoint | |||
| The authorization server's HTTP endpoint capable of issuing | The authorization server's HTTP endpoint capable of issuing | |||
| tokens and refreshing expired tokens. The token endpoint is | tokens and refreshing expired tokens. The token endpoint is | |||
| described in Section 4. | described in Section 5. | |||
| client identifier | client identifier | |||
| A unique identifier issued to the client to identify itself to | A unique identifier issued to the client to identify itself to | |||
| the authorization server. Client identifiers may have a | the authorization server. Client identifiers may have a | |||
| matching secret. The client identifier is described in | matching secret. The client identifier is described in | |||
| Section 2. | Section 3. | |||
| 1.3. Overview | 1.3. Overview | |||
| OAuth provides a method for clients to access a protected resource on | OAuth provides a method for clients to access a protected resource on | |||
| behalf of a resource owner. Before a client can access a protected | behalf of a resource owner. Before a client can access a protected | |||
| resource, it must first obtain authorization from the resource owner, | resource, it must first obtain authorization (access grant) from the | |||
| then exchange the access grant for an access token (representing the | resource owner, then exchange the access grant for an access token | |||
| grant's scope, duration, and other attributes). The client accesses | (representing the grant's scope, duration, and other attributes). | |||
| the protected resource by presenting the access token to the resource | The client accesses the protected resource by presenting the access | |||
| server. | token to the resource server. | |||
| +--------+ +---------------+ | The access token provides an abstraction layer, replacing different | |||
| | |--(A)-- Authorization Request --->| Resource | | authorization constructs (e.g. username and password, assertion) for | |||
| | | | Owner | | a single token understood by the resource server. This abstraction | |||
| | |<-(B)------ Access Grant ---------| | | enables issuing access tokens valid for a short time period, as well | |||
| | | +---------------+ | as removing the resource server's need to understand a wide range of | |||
| authentication schemes. | ||||
| +--------+ +---------------+ | ||||
| | |--(A)- Authorization Request ->| Resource | | ||||
| | | | Owner | | ||||
| | |<-(B)----- Access Grant -------| | | ||||
| | | +---------------+ | ||||
| | | | | | | |||
| | | Client Credentials & +---------------+ | | | Access Grant & +---------------+ | |||
| | |--(C)------ Access Grant -------->| Authorization | | | |--(C)--- Client Credentials -->| Authorization | | |||
| | Client | | Server | | | Client | | Server | | |||
| | |<-(D)------ Access Token ---------| | | | |<-(D)----- Access Token -------| | | |||
| | | (w/ Optional Refresh Token) +---------------+ | | | +---------------+ | |||
| | | | | | | |||
| | | +---------------+ | | | +---------------+ | |||
| | |--(E)------ Access Token -------->| Resource | | | |--(E)----- Access Token ------>| Resource | | |||
| | | | Server | | | | | Server | | |||
| | |<-(F)---- Protected Resource -----| | | | |<-(F)--- Protected Resource ---| | | |||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| Figure 1: Abstract Protocol Flow | Figure 1: Abstract Protocol Flow | |||
| The abstract flow illustrated in Figure 1 includes the following | The abstract flow illustrated in Figure 1 describes the overall | |||
| steps: | protocol architecture and includes the following steps: | |||
| (A) The client requests authorization from the resource owner. The | (A) The client requests authorization from the resource owner. The | |||
| client should not request the resource owner's credentials | authorization request can be made directly to the resource | |||
| directly. Instead, it should request authorization via an | owner, or preferably indirectly via an intermediary such as an | |||
| authorization server or other entities. For example, the client | authorization server. | |||
| directs the resource owner to the authorization server which in | ||||
| turn issues it an access grant. When unavoidable, the client | ||||
| interacts directly with the end-user, asking for the end-user's | ||||
| username and password. If the client is acting autonomously, | ||||
| the authorization request is beyond the scope of this | ||||
| specification. | ||||
| (B) The client is issued an access grant which represents the | ||||
| authorization provided by the resource owner. The access grant | ||||
| can be expressed as: | ||||
| * Authorization code - an access grant obtained via an | ||||
| authorization server. Section 3 describes how to obtain an | ||||
| authorization code when the end-user is present and using a | ||||
| user-agent. | ||||
| * Assertion - an access grant obtained using a different trust | ||||
| framework. Assertions enable the client to utilize existing | ||||
| trust relationships to obtain an access token. They provide | ||||
| a bridge between OAuth and other trust frameworks. The | ||||
| access grant represented by an assertion depends on the | ||||
| assertion type, its content, and how it was issued, which are | ||||
| beyond the scope of this specification. | ||||
| * Resource owner password credentials - obtained when | (B) The client receives an access grant which represents the | |||
| interacting directly with a resource-owner. Resource owner | authorization provided by the resource owner. | |||
| password credentials (i.e. a username and password) should | ||||
| only be used when there is a high degree of trust between the | ||||
| resource owner and the client (e.g. its computer operating | ||||
| system or a highly privileged application). However, unlike | ||||
| the HTTP Basic authentication scheme defined in [RFC2617], | ||||
| the resource owner's credentials are used for a single | ||||
| request and are exchanged for an access token and refresh | ||||
| token. This eliminates the need for the client to store the | ||||
| resource-owner's credentials for future use. | ||||
| (C) The client requests an access token by authenticating with the | (C) The client requests an access token by authenticating with the | |||
| authorization server, and presenting the access grant. The | authorization server using its client credentials, and | |||
| token request is described in Section 4. | presenting the access grant. | |||
| (D) The authorization server validates the client credentials and | (D) The authorization server validates the client credentials and | |||
| the access grant, and issues an access token with an optional | the access grant, and if valid issues an access token. | |||
| refresh token. Access tokens usually have a shorter lifetime | ||||
| than the access grant. Refresh tokens usually have a lifetime | ||||
| equal to the duration of the access grant. When an access token | ||||
| expires, the refresh token is used to obtain a new access token | ||||
| without having to request another access grant from the resource | ||||
| owner. | ||||
| (E) The client makes a protected resource request to the resource | (E) The client makes a protected resource request to the resource | |||
| server, and presents the access token in order to gain access. | server by presenting the access token. | |||
| Accessing a protected resource is described in Section 5. | ||||
| (F) The resource server validates the access token, and if valid, | (F) The resource server validates the access token, and if valid, | |||
| serves the request. | serves the request. | |||
| When the client is acting on its own behalf (the client is also the | 1.4. Access Grants | |||
| resource owner), the client does not obtain an access grant. The | ||||
| simplified protocol flow is illustrated in Figure 2: | ||||
| +--------+ +---------------+ | The access grant represents the authorization provided by the | |||
| | |--(C)--- Client Credentials ----->| Authorization | | resource owner. The access grant type depends on the method used by | |||
| | | | Server | | the client and supported by the authorization server to obtain it. | |||
| | |<-(D)------ Access Token ---------| | | ||||
| | | +---------------+ | ||||
| | Client | | ||||
| | | +---------------+ | ||||
| | |--(E)------ Access Token -------->| Resource | | ||||
| | | | Server | | ||||
| | |<-(F)---- Protected Resource -----| | | ||||
| +--------+ +---------------+ | ||||
| Figure 2: Protocol Flow for Client Acting On Its Own Behalf | 1.4.1. Authorization Code | |||
| When the client uses the user-agent profile (described in | The authorization code is an access grant obtained by directing the | |||
| Section 1.4.2), the authorization request results in an access token, | end-user to an authorization server. The authorization server | |||
| as illustrated in Figure 3: | authenticates the end-user, obtains authorization, and issues the an | |||
| authorization code to the client. Because the end-user only | ||||
| authenticates with the authorization server, the end-user's password | ||||
| is never shared with the client. | ||||
| +--------+ +----------+ +---------------+ | The authorization code access grant is suitable when the client is | |||
| | |--(A)-- Authorization --+- -+-->| | | interacting with an end-user via a user-agent. | |||
| | | Request | Resource | | Authorization | | ||||
| | | | Owner | | Server | | ||||
| | |<-(D)-- Access Token ---+- -+---| | | ||||
| | | +----------+ +---------------+ | ||||
| | Client | | ||||
| | | +---------------+ | ||||
| | |--(E)-------- Access Token ----------->| Resource | | ||||
| | | | Server | | ||||
| | |<-(F)------ Protected Resource --------| | | ||||
| +--------+ +---------------+ | ||||
| Figure 3: Indirect Access Grant Protocol Flow | +----------+ | |||
| | | | ||||
| | End-User | | ||||
| | | | ||||
| +----------+ | ||||
| ^ | ||||
| | | ||||
| (B) | ||||
| +----|-----+ Client Identifier +---------------+ | ||||
| | -+--(A)--- & Redirect URI ----->| | | ||||
| | User- | | Authorization | | ||||
| | Agent -|--(B)-- User authenticates -->| Server | | ||||
| | | | | | ||||
| | -+--(C)-- Authorization Code --<| | | ||||
| +-|----|---+ +---------------+ | ||||
| (A) (C) | ||||
| | | | ||||
| ^ v | ||||
| +---------+ | ||||
| | | | ||||
| | Client | | ||||
| | | | ||||
| +---------+ | ||||
| 1.4. Client Profiles | Figure 2: Obtaining an Authorization Code | |||
| OAuth supports a wide range of client types by providing a rich and | The authorization code flow illustrated in Figure 2 includes the | |||
| extensible framework for establishing authorization and exchanging it | following steps: | |||
| for an access token. The methods detailed in this specification were | ||||
| designed to accommodate four client types: web servers, user-agents, | ||||
| native applications, and autonomous clients. Additional | ||||
| authorization flows and client profiles may be defined by other | ||||
| specifications to cover additional scenarios and client types. | ||||
| 1.4.1. Web Server | (A) The client initiates the flow by directing the end-user's user- | |||
| agent to the authorization server's end-user authorization | ||||
| endpoint. The client includes its client identifier, requested | ||||
| scope, local state, and a redirection URI (to which the | ||||
| authorization server will send the user-agent back once access | ||||
| is granted or denied). | ||||
| (B) The authorization server authenticates the end-user (via the | ||||
| user-agent) and establishes whether the end-user grants or | ||||
| denies the client's access request. | ||||
| (C) If access is granted, the authorization server directs the user- | ||||
| agent back to the client using the redirection URI provided. | ||||
| The authorization server includes an authorization code for the | ||||
| client to use to obtain an access token. | ||||
| Once the client obtains an authorization code, it requests an access | ||||
| token by authenticating with the authorization server (using its | ||||
| client credentials) and presenting the authorization code (access | ||||
| grant). | ||||
| In cases where the client is incapable of maintaining its client | ||||
| credentials secret (such as native applications or an application | ||||
| implemented as a user-agent script), the authorization server issues | ||||
| an access token directly to the client in step (C), instead of | ||||
| issuing an authorization code. | ||||
| Obtaining an authorization code is described in Section 4. | ||||
| 1.4.2. Resource Owner Password Credentials | ||||
| The resource owner password credentials (e.g. a username and | ||||
| password) can be used directly as an access grant to obtain an access | ||||
| token. The credentials should only be used when there is a high | ||||
| degree of trust between the resource owner and the client (e.g. its | ||||
| computer operating system or a highly privileged application), and | ||||
| when other access grant types are not available (such as an | ||||
| authorization code). | ||||
| Even though this grant type requires direct client access to the | ||||
| resource owner's credentials, the resource owner's credentials are | ||||
| used for a single request and are exchanged for an access token. | ||||
| Unlike the HTTP Basic authentication scheme defined in [RFC2617], | ||||
| this grant type eliminates the need for the client to store the | ||||
| resource-owner's credentials for future use. | ||||
| In Figure 3, the client requests authorization from the resource | ||||
| owner directly. When the resource owner is an end-user, the client | ||||
| typically prompts the end-user for the username and password. | ||||
| +--------+ +----------+ | ||||
| | |--(A)- Authorization Request ->| Resource | | ||||
| | Client | | Owner | | ||||
| | |<-(B)-- Username & Password ---| | | ||||
| +--------+ +----------+ | ||||
| Figure 3: Obtaining Resource Owner Password Credentials | ||||
| 1.4.3. Client Credentials | ||||
| The client credentials can be used as an access grant when the | ||||
| authorization scope is limited to the protected resources under the | ||||
| control of the client, or other protected resources previously | ||||
| arranged with the authorization server. Client credentials are used | ||||
| as an access grant typically when the client is acting on its own | ||||
| behalf (the client is also the resource owner). | ||||
| 1.4.4. Refresh Token | ||||
| Access tokens usually have a shorter lifetime than authorized by the | ||||
| resource owner. When issuing an access token, the authorization | ||||
| server can include a refresh token which is used by the client to | ||||
| obtain a new access token when the current access token expires. | ||||
| When requesting a new access token, the refresh token acts as an | ||||
| access grant. Using a refresh token removes the need to interact | ||||
| with the resource owner again, or to store the original access grant | ||||
| used to obtain the access token and refresh token. | ||||
| +--------+ Access Grant & +---------------+ | ||||
| | |--(A)-- Client Credentials -->| Authorization | | ||||
| | | | Server | | ||||
| | |<-(B)---- Access Token -------| | | ||||
| | | & Refresh Token +---------------+ | ||||
| | | | ||||
| | | +---------------+ | ||||
| | |--(C)----- Access Token ----->| | | ||||
| | | | | | ||||
| | |<-(D)-- Protected Resource ---| Resource | | ||||
| | Client | | Server | | ||||
| | |--(E)----- Access Token ----->| | | ||||
| | | | | | ||||
| | |<-(F)-- Invalid Token Error --| | | ||||
| | | +---------------+ | ||||
| | | | ||||
| | | Refresh Token & +---------------+ | ||||
| | |--(G)-- Client Credentials -->| Authorization | | ||||
| | | | Server | | ||||
| | |<-(H)----- Access Token ------| | | ||||
| +--------+ & Optional Refresh Token +---------------+ | ||||
| Figure 4: Refreshing an Access Token | ||||
| The refresh token flow illustrated in Figure 4 includes the following | ||||
| steps: | ||||
| (A) The client requests an access token by authenticating with the | ||||
| authorization server using its client credentials, and | ||||
| presenting an access grant. | ||||
| (B) The authorization server validates the client credentials and | ||||
| the access grant, and if valid issues an access token and a | ||||
| refresh token. | ||||
| (C) The client makes a protected resource requests to the resource | ||||
| server by presenting the access token. | ||||
| (D) The resource server validates the access token, and if valid, | ||||
| serves the request. | ||||
| (E) Steps (C) and (D) repeat until the access token expires. If the | ||||
| client does not know the access token expired, it makes another | ||||
| protected resource request. Otherwise, it skips to step (G). | ||||
| (F) Since the access token is invalid (expired), the resource server | ||||
| returns an invalid token error. | ||||
| (G) The client requests a new access token by authenticating with | ||||
| the authorization server using its client credentials, and | ||||
| presenting the refresh token (as the access grant). | ||||
| (H) The authorization server validates the client credentials and | ||||
| the refresh token, and if valid issues a new access token (and | ||||
| optionally, a new refresh token). | ||||
| 1.4.5. Assertion | ||||
| Assertions provide a bridge between OAuth and other trust frameworks. | ||||
| They enable the client to utilize existing trust relationships in | ||||
| order to obtain an access token. The access grant represented by an | ||||
| assertion depends on the assertion type, its content, and how it was | ||||
| issued, which are beyond the scope of this specification. | ||||
| Assertions are used as part of the protocol extensibility model, | ||||
| providing a way for authorization servers to support additional | ||||
| access grant types. | ||||
| 2. Client Profiles | ||||
| [[ add intro and find new names for the profiles. this section will | ||||
| have normative language in future drafts, similar to -05 and earlier. | ||||
| ]] | ||||
| 2.1. Web Server | ||||
| The web server profile is suitable for clients capable of interacting | The web server profile is suitable for clients capable of interacting | |||
| with the end-user's user-agent (typically a web browser) and capable | with the end-user's user-agent (typically a web browser) and capable | |||
| of receiving incoming requests from the authorization server (capable | of receiving incoming requests (via redirection) from the | |||
| of acting as an HTTP server). | authorization server (capable of acting as an HTTP server). | |||
| +----------+ Client Identifier +---------------+ | +----------+ Client Identifier +---------------+ | |||
| | -+----(A)--- & Redirect URI ------>| | | | -+----(A)--- & Redirect URI ------>| | | |||
| | End-user | | Authorization | | | End-user | | Authorization | | |||
| | at |<---(B)-- User authenticates --->| Server | | | at |<---(B)-- User authenticates --->| Server | | |||
| | Browser | | | | | Browser | | | | |||
| | -+----(C)-- Authorization Code ---<| | | | -+----(C)-- Authorization Code ---<| | | |||
| +-|----|---+ +---------------+ | +-|----|---+ +---------------+ | |||
| | | ^ v | | | ^ v | |||
| (A) (C) | | | (A) (C) | | | |||
| | | | | | | | | | | |||
| ^ v | | | ^ v | | | |||
| +---------+ | | | +---------+ | | | |||
| | |>---(D)-- Client Credentials, --------' | | | |>---(D)-- Client Credentials, --------' | | |||
| | Web | Authorization Code, | | | Server | Authorization Code, | | |||
| | Client | & Redirect URI | | | -Based | & Redirect URI | | |||
| | | | | | Client | | | |||
| | |<---(E)----- Access Token -------------------' | | |<---(E)----- Access Token -------------------' | |||
| +---------+ (w/ Optional Refresh Token) | +---------+ (w/ Optional Refresh Token) | |||
| Figure 4: Web Server Flow | Figure 5: Web Server Flow | |||
| The web server flow illustrated in Figure 4 includes the following | The web server flow illustrated in Figure 5 includes the following | |||
| steps: | steps: | |||
| (A) The web client initiates the flow by redirecting the end-user's | (A) The web client initiates the flow by redirecting the end-user's | |||
| user-agent to the end-user authorization endpoint as described | user-agent to the end-user authorization endpoint as described | |||
| in Section 3. The client includes its client identifier, | in Section 4. The client includes its client identifier, | |||
| requested scope, local state, and a redirect URI to which the | requested scope, local state, and a redirect URI to which the | |||
| authorization server will send the end-user back once access is | authorization server will send the end-user back once access is | |||
| granted (or denied). | granted (or denied). | |||
| (B) The authorization server authenticates the end-user (via the | (B) The authorization server authenticates the end-user (via the | |||
| user-agent) and establishes whether the end-user grants or | user-agent) and establishes whether the end-user grants or | |||
| denies the client's access request. | denies the client's access request. | |||
| (C) Assuming the end-user granted access, the authorization server | (C) Assuming the end-user granted access, the authorization server | |||
| redirects the user-agent back to the client to the redirection | redirects the user-agent back to the client to the redirection | |||
| URI provided earlier. The authorization includes an | URI provided earlier. The authorization includes an | |||
| authorization code for the client to use to obtain an access | authorization code for the client to use to obtain an access | |||
| token. | token. | |||
| (D) The client requests an access token from the authorization | (D) The client requests an access token from the authorization | |||
| server by authenticating and including the authorization code | server by authenticating and including the authorization code | |||
| received in the previous step as described in Section 4. | received in the previous step as described in Section 5. | |||
| (E) The authorization server validates the client credentials and | (E) The authorization server validates the client credentials and | |||
| the authorization code and responds back with the access token. | the authorization code and responds back with the access token. | |||
| 1.4.2. User-Agent | 2.2. User-Agent | |||
| The user-agent profile is suitable for client applications residing | The user-agent profile is suitable for client applications residing | |||
| in a user-agent, typically implemented in a browser using a scripting | in a user-agent, typically implemented in a browser using a scripting | |||
| language such as JavaScript. These clients cannot keep client | language such as JavaScript. These clients cannot keep client | |||
| secrets confidential and the authentication of the client is based on | secrets confidential and the authentication of the client is based on | |||
| the user-agent's same-origin policy. | the user-agent's same-origin policy. | |||
| Unlike other profiles in which the client makes separate requests for | Unlike other profiles in which the client makes separate requests for | |||
| end-user authorization and access token, the client receives the | end-user authorization and access token, the client receives the | |||
| access token as a result of the end-user authorization request in the | access token as a result of the end-user authorization request in the | |||
| skipping to change at page 12, line 22 ¶ | skipping to change at page 15, line 4 ¶ | |||
| | in | in Fragment +----------------+ | | in | in Fragment +----------------+ | |||
| | Browser | | | Browser | | |||
| | | +----------------+ | | | +----------------+ | |||
| | |>---(D)--- Redirect URI ------->| | | | |>---(D)--- Redirect URI ------->| | | |||
| | | without Fragment | Web Server | | | | without Fragment | Web Server | | |||
| | | | with Client | | | | | with Client | | |||
| | (F) |<---(E)--- Web Page with ------<| Resource | | | (F) |<---(E)--- Web Page with ------<| Resource | | |||
| | Access | Script | | | | Access | Script | | | |||
| | Token | +----------------+ | | Token | +----------------+ | |||
| +----------+ | +----------+ | |||
| Figure 6: User-Agent Flow | ||||
| Figure 5: User-Agent Flow | The user-agent flow illustrated in Figure 6 includes the following | |||
| The user-agent flow illustrated in Figure 5 includes the following | ||||
| steps: | steps: | |||
| (A) The client sends the user-agent to the end-user authorization | (A) The client sends the user-agent to the end-user authorization | |||
| endpoint as described in Section 3. The client includes its | endpoint as described in Section 4. The client includes its | |||
| client identifier, requested scope, local state, and a redirect | client identifier, requested scope, local state, and a redirect | |||
| URI to which the authorization server will send the end-user | URI to which the authorization server will send the end-user | |||
| back once authorization is granted (or denied). | back once authorization is granted (or denied). | |||
| (B) The authorization server authenticates the end-user (via the | (B) The authorization server authenticates the end-user (via the | |||
| user-agent) and establishes whether the end-user grants or | user-agent) and establishes whether the end-user grants or | |||
| denies the client's access request. | denies the client's access request. | |||
| (C) If the end-user granted access, the authorization server | (C) If the end-user granted access, the authorization server | |||
| redirects the user-agent to the redirection URI provided | redirects the user-agent to the redirection URI provided | |||
| skipping to change at page 13, line 9 ¶ | skipping to change at page 15, line 38 ¶ | |||
| (E) The web server returns a web page (typically an HTML page with | (E) The web server returns a web page (typically an HTML page with | |||
| an embedded script) capable of accessing the full redirection | an embedded script) capable of accessing the full redirection | |||
| URI including the fragment retained by the user-agent, and | URI including the fragment retained by the user-agent, and | |||
| extracting the access token (and other parameters) contained in | extracting the access token (and other parameters) contained in | |||
| the fragment. | the fragment. | |||
| (F) The user-agent executes the script provided by the web server | (F) The user-agent executes the script provided by the web server | |||
| locally, which extracts the access token and passes it to the | locally, which extracts the access token and passes it to the | |||
| client. | client. | |||
| 1.4.3. Native Application | 2.3. Native Application | |||
| Native application are clients running as native code on the end- | Native applications are clients running as native code on the end- | |||
| user's computer or device (i.e. executing outside a user-agent or as | user's computer or device (i.e. executing outside a user-agent or as | |||
| a desktop program). These clients are often capable of interacting | a desktop program). These clients are often capable of interacting | |||
| with (or embedding) the end-user's user-agent but are limited in how | with (or embedding) the end-user's user-agent but are limited in how | |||
| such interaction affects their end-user experience. In many cases, | such interaction affects their end-user experience. In many cases, | |||
| native applications are incapable of receiving direct callback | native applications are incapable of receiving direct callback | |||
| requests from the server (e.g. firewall, operating system | requests from the server (e.g. firewall, operating system | |||
| restrictions). | restrictions). | |||
| Native application clients can be implemented in different ways based | Native application clients can be implemented in different ways based | |||
| on their requirements and desired end-user experience. Native | on their requirements and desired end-user experience. Native | |||
| application clients can: | application clients can: | |||
| o Utilize the end-user authorization endpoint as described in | o Utilize the end-user authorization endpoint as described in | |||
| Section 3 by launching an external user-agent. The client can | Section 4 by launching an external user-agent. The client can | |||
| capture the response by providing a redirection URI with a custom | capture the response by providing a redirection URI with a custom | |||
| URI scheme (registered with the operating system to invoke the | URI scheme (registered with the operating system to invoke the | |||
| client application), or by providing a redirection URI pointing to | client application), or by providing a redirection URI pointing to | |||
| a server-hosted resource under the client's control which makes | a server-hosted resource under the client's control which makes | |||
| the response available to the client (e.g. using the window title | the response available to the client (e.g. using the window title | |||
| or other locations accessible from outside the user-agent). | or other locations accessible from outside the user-agent). | |||
| o Utilize the end-user authorization endpoint as described in | o Utilize the end-user authorization endpoint as described in | |||
| Section 3 by using an embedded user-agent. The client obtains the | Section 4 by using an embedded user-agent. The client obtains the | |||
| response by directly communicating with the embedded user-agent. | response by directly communicating with the embedded user-agent. | |||
| o Prompt end-users for their password and use them directly to | o Prompt end-users for their password and use them directly to | |||
| obtain an access token. This is generally discouraged, as it | obtain an access token. This is generally discouraged, as it | |||
| hands the end-user's password directly to the third-party client | hands the end-user's password directly to the third-party client | |||
| which in turn has to store it in clear-text. It also requires the | which in turn has to store it in clear-text. It also requires the | |||
| server to support password-based authentication. | server to support password-based authentication. | |||
| When choosing between launching an external browser and an embedded | When choosing between launching an external browser and an embedded | |||
| user-agent, developers should consider the following: | user-agent, developers should consider the following: | |||
| skipping to change at page 14, line 9 ¶ | skipping to change at page 16, line 37 ¶ | |||
| o External user-agents may improve completion rate as the end-user | o External user-agents may improve completion rate as the end-user | |||
| may already be logged-in and not have to re-authenticate. | may already be logged-in and not have to re-authenticate. | |||
| o Embedded user-agents often offer a better end-user flow, as they | o Embedded user-agents often offer a better end-user flow, as they | |||
| remove the need to switch context and open new windows. | remove the need to switch context and open new windows. | |||
| o Embedded user-agents pose a security challenge because users are | o Embedded user-agents pose a security challenge because users are | |||
| authenticating in an unidentified window without access to the | authenticating in an unidentified window without access to the | |||
| visual protections offered by many user-agents. | visual protections offered by many user-agents. | |||
| 1.4.4. Autonomous | 2.4. Autonomous | |||
| Autonomous clients utilize an existing trust relationship or | Autonomous clients utilize an existing trust relationship or | |||
| framework to establish authorization. Autonomous clients can be | framework to establish authorization. Autonomous clients can be | |||
| implemented in different ways based on their requirements and the | implemented in different ways based on their requirements and the | |||
| existing trust framework they rely upon. Autonomous clients can: | existing trust framework they rely upon. Autonomous clients can: | |||
| o Obtain an access token by authenticating with the authorization | o Obtain an access token by authenticating with the authorization | |||
| server using their client credentials. The scope of the access | server using their client credentials. The scope of the access | |||
| token is limited to the protected resources under the control of | token is limited to the protected resources under the control of | |||
| the client, or that of another resource owner previously arranged | the client, or that of another resource owner previously arranged | |||
| with the authorization server. | with the authorization server. | |||
| o Use an existing access grant expressed as an assertion using an | o Use an existing access grant expressed as an assertion using an | |||
| assertion format supported by the authorization server. Using | assertion format supported by the authorization server. Using | |||
| assertions requires the client to obtain a assertion (such as a | assertions requires the client to obtain an assertion (such as a | |||
| SAML [OASIS.saml-core-2.0-os] assertion) from an assertion issuer | SAML [OASIS.saml-core-2.0-os] assertion) from an assertion issuer | |||
| or to self-issue an assertion. The assertion format, the process | or to self-issue an assertion. The assertion format, the process | |||
| by which the assertion is obtained, and the method of validating | by which the assertion is obtained, and the method of validating | |||
| the assertion are defined by the assertion issuer and the | the assertion are defined by the assertion issuer and the | |||
| authorization server, and are beyond the scope of this | authorization server, and are beyond the scope of this | |||
| specification. | specification. | |||
| 2. Client Credentials | 3. Client Credentials | |||
| When interacting with the authorization server, the client identifies | When interacting with the authorization server, the client identifies | |||
| itself using a client identifier and authenticates using a set of | itself using a set of client credentials which include a client | |||
| client credentials. This specification provides one mechanism for | identifier and other properties for client authentication. The means | |||
| authenticating the client using password credentials. | through which the client obtains its credentials are beyond the scope | |||
| of this specification, but typically involve registration with the | ||||
| The means through which the client obtains its credentials are beyond | authorization server. | |||
| the scope of this specification, but usually involve registration | ||||
| with the authorization server. [[ OAuth Discovery provides one way of | ||||
| obtaining a client password ]] | ||||
| Due to the nature of some clients, authorization servers SHOULD NOT | Due to the nature of some clients, authorization servers SHOULD NOT | |||
| make assumptions about the confidentiality of client secrets without | make assumptions about the confidentiality of client secrets without | |||
| establishing trust with the client operator. Authorization servers | establishing trust with the client. Authorization servers SHOULD NOT | |||
| SHOULD NOT issue client secrets to clients incapable of keeping their | issue client secrets to clients incapable of keeping their secrets | |||
| secrets confidential. | confidential. | |||
| The authorization server MAY authenticate the client using any | The authorization server MAY authenticate the client using any | |||
| appropriate set of credentials and authentication scheme. The client | appropriate set of credentials and authentication schemes. The | |||
| MUST NOT utilize more than one set of credentials or authentication | client MUST NOT include more than one set of credentials or | |||
| mechanism with each request. | authentication mechanism with each request. | |||
| 2.1. Client Password Credentials | 3.1. Client Password Credentials | |||
| The client password credentials use a shared symmetric secret to | The client password credentials use a shared symmetric secret to | |||
| authenticate the client. The client identifier and password are | authenticate the client. The client identifier and password are | |||
| included in the request using the HTTP Basic authentication scheme as | included in the request using the HTTP Basic authentication scheme as | |||
| defined in [RFC2617] by including the client identifier as the | defined in [RFC2617] by including the client identifier as the | |||
| username and client password as the password. | username and client password as the password. | |||
| For example (line breaks are for display purposes only): | For example (line breaks are for display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW | Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
| grant_type=authorization_code&client_id=s6BhdRkqt3&code=i1WsRn1uB1& | grant_type=authorization_code&code=i1WsRn1uB1& | |||
| redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | |||
| Alternatively, the client MAY include the password in the request | Alternatively, the client MAY include the password in the request | |||
| body using the following parameter: | body using the following parameters: | |||
| client_id | ||||
| REQUIRED. The client identifier. | ||||
| client_secret REQUIRED. The client password. | client_secret REQUIRED. The client password. | |||
| For example (line breaks are for display purposes only): | For example (line breaks are for display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
| grant_type=authorization_code&client_id=s6BhdRkqt3& | grant_type=authorization_code&client_id=s6BhdRkqt3& | |||
| client_secret=gX1fBat3bV&code=i1WsRn1uB1& | client_secret=gX1fBat3bV&code=i1WsRn1uB1& | |||
| redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | |||
| The authorization server MUST accept the client credentials using | The authorization server MUST accept the client credentials using | |||
| both the request parameter, and the HTTP Basic authentication scheme. | both the request parameter, and the HTTP Basic authentication scheme. | |||
| The authorization server MAY support additional authentication | The authorization server MAY support additional authentication | |||
| schemes suitable for the transmission of a password. | schemes suitable for the transmission of password credentials. | |||
| 3. Obtaining End-User Authorization | 3.2. Client Assertion Credentials | |||
| When the client interacts with an end-user, the end-user MUST first | The client assertion credentials are used in cases where a password | |||
| grant the client authorization to access its protected resources. | (clear-text shared symmetric secret) is unsuitable or does not | |||
| Once obtained, the end-user access grant is expressed as an | provide sufficient security for client authentication. In such cases | |||
| authorization code which the client uses to obtain an access token. | it is common to use other mechanisms such as HMAC or digital | |||
| To obtain an end-user authorization, the client sends the end-user to | signatures that do not require sending clear-text secrets. The | |||
| the end-user authorization endpoint. | client assertion credentials provide an extensible mechanism to use | |||
| an assertion format supported by the authorization server for | ||||
| authentication the client. | ||||
| Using assertions requires the client to obtain an assertion (such as | ||||
| a SAML [OASIS.saml-core-2.0-os] assertion) from an assertion issuer | ||||
| or to self-issue an assertion. The assertion format, the process by | ||||
| which the assertion is obtained, and the method of validating the | ||||
| assertion are defined by the assertion issuer and the authorization | ||||
| server, and are beyond the scope of this specification. | ||||
| When using a client assertion, the client includes the following | ||||
| parameters: | ||||
| client_assertion_type REQUIRED. The format of the assertion as | ||||
| defined by the authorization server. The value MUST be an | ||||
| absolute URI. | ||||
| client_assertion REQUIRED. The client assertion. | ||||
| For example, the client sends the following access token request | ||||
| using a SAML 2.0 assertion to authenticate itself (line breaks are | ||||
| for display purposes only): | ||||
| POST /token HTTP/1.1 | ||||
| Host: server.example.com | ||||
| Content-Type: application/x-www-form-urlencoded | ||||
| grant_type=authorization_code&code=i1WsRn1uB1& | ||||
| client_assertion=PHNhbWxwOl[...omitted for brevity...]ZT4%3D& | ||||
| client_assertion_type= | ||||
| urn%3Aoasis%3Anames%sAtc%3ASAML%3A2.0%3Aassertion& | ||||
| redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | ||||
| When obtaining an access token using a client assertion together with | ||||
| an authorization code (as described in Section 5.1.1), a mechanism is | ||||
| needed to map between the value of "client_id" parameter used to | ||||
| obtain the authorization code, and the client assertion. Such | ||||
| mechanism is beyond the out of scope for this specification, but MUST | ||||
| be specified for any client assertion type used in combination with | ||||
| an authorization code. | ||||
| The authorization server MUST reject access token requests using | ||||
| client assertion credentials that do not contain HMAC or signed | ||||
| values that: | ||||
| o State the assertion was specifically issued to be consumed by the | ||||
| receiving endpoint (typically via an audience or recipient value | ||||
| containing the receiving endpoint's identifier). | ||||
| o Identify the entity that issued the assertion (typically via an | ||||
| issuer value). | ||||
| o Identify when the assertion expires as an absolute time (typically | ||||
| via an expiration value containing a UTC date/time value). The | ||||
| authorization server MUST reject expired assertions. | ||||
| 4. Obtaining End-User Authorization | ||||
| Before the client can access a protect resource, it MUST first obtain | ||||
| authorization from the end-user. To obtain an end-user | ||||
| authorization, the client sends the end-user to the end-user | ||||
| authorization endpoint. Once obtained, the end-user access grant is | ||||
| expressed as an authorization code which the client uses to obtain an | ||||
| access token. | ||||
| At the end-user authorization endpoint, the end-user first | At the end-user authorization endpoint, the end-user first | |||
| authenticates with the authorization server, and then grants or | authenticates with the authorization server, and then grants or | |||
| denies the access request. The way in which the authorization server | denies the access request. The way in which the authorization server | |||
| authenticates the end-user (e.g. username and password login, OpenID, | authenticates the end-user (e.g. username and password login, OpenID, | |||
| session cookies) and in which the authorization server obtains the | session cookies) and in which the authorization server obtains the | |||
| end-user's authorization, including whether it uses a secure channel | end-user's authorization, including whether it uses a secure channel | |||
| such as TLS, is beyond the scope of this specification. However, the | such as TLS, is beyond the scope of this specification. However, the | |||
| authorization server MUST first verify the identity of the end-user. | authorization server MUST first verify the identity of the end-user. | |||
| The location of the end-user authorization endpoint can be found in | The location of the end-user authorization endpoint can be found in | |||
| the service documentation, or can be obtained by using [[ OAuth | the service documentation. The end-user authorization endpoint URI | |||
| Discovery ]]. The end-user authorization endpoint URI MAY include a | MAY include a query component as defined by [RFC3986] section 3, | |||
| query component as defined by [RFC3986] section 3, which must be | which must be retained when adding additional query parameters. | |||
| retained when adding additional query parameters. | ||||
| Since requests to the end-user authorization endpoint result in user | Since requests to the end-user authorization endpoint result in user | |||
| authentication and the transmission of sensitive information, the | authentication and the transmission of sensitive information, the | |||
| authorization server SHOULD require the use of a transport-layer | authorization server SHOULD require the use of a transport-layer | |||
| security mechanism such as TLS when sending requests to the end-user | security mechanism such as TLS when sending requests to the end-user | |||
| authorization endpoint. | authorization endpoint. | |||
| 4.1. Authorization Request | ||||
| In order to direct the end-user's user-agent to the authorization | In order to direct the end-user's user-agent to the authorization | |||
| server, the client constructs the request URI by adding the following | server, the client constructs the request URI by adding the following | |||
| parameters to the end-user authorization endpoint URI query component | parameters to the end-user authorization endpoint URI query component | |||
| using the "application/x-www-form-urlencoded" format as defined by | using the "application/x-www-form-urlencoded" format as defined by | |||
| [W3C.REC-html401-19991224]: | [W3C.REC-html401-19991224]: | |||
| response_type | response_type | |||
| REQUIRED. The requested response: an access token, an | REQUIRED. The requested response: an access token, an | |||
| authorization code, or both. The parameter value MUST be set | authorization code, or both. The parameter value MUST be set | |||
| to "token" for requesting an access token, "code" for | to "token" for requesting an access token, "code" for | |||
| requesting an authorization code, or "code_and_token" to | requesting an authorization code, or "code_and_token" to | |||
| request both. The authorization server MAY decline to provide | request both. The authorization server MAY decline to provide | |||
| one or more of these response types. [[ The 'code_and_token' | one or more of these response types. | |||
| type is pending use cases and may be removed for the | ||||
| specification ]] | ||||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 2. | REQUIRED. The client identifier as described in Section 3. | |||
| redirect_uri | redirect_uri | |||
| REQUIRED, unless a redirection URI has been established between | REQUIRED, unless a redirection URI has been established between | |||
| the client and authorization server via other means. An | the client and authorization server via other means. An | |||
| absolute URI to which the authorization server will redirect | absolute URI to which the authorization server will redirect | |||
| the user-agent to when the end-user authorization step is | the user-agent to when the end-user authorization step is | |||
| completed. The authorization server SHOULD require the client | completed. The authorization server SHOULD require the client | |||
| to pre-register their redirection URI. | to pre-register their redirection URI. | |||
| scope | scope | |||
| skipping to change at page 17, line 47 ¶ | skipping to change at page 21, line 47 ¶ | |||
| following HTTP request using transport-layer security (line breaks | following HTTP request using transport-layer security (line breaks | |||
| are for display purposes only): | are for display purposes only): | |||
| GET /authorize?response_type=code&client_id=s6BhdRkqt3& | GET /authorize?response_type=code&client_id=s6BhdRkqt3& | |||
| 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 | |||
| If the client has previously registered a redirection URI with the | If the client has previously registered a redirection URI with the | |||
| authorization server, the authorization server MUST verify that the | authorization server, the authorization server MUST verify that the | |||
| redirection URI received matches the registered URI associated with | redirection URI received matches the registered URI associated with | |||
| the client identifier. [[ provide guidance on how to perform matching | the client identifier. The authorization server SHOULD NOT redirect | |||
| ]] | the user-agent to unregistered or untrusted URIs to prevent the | |||
| endpoint from being used as an open redirector. If no valid | ||||
| redirection URI is available, the authorization server SHOULD inform | ||||
| the end-user of the error occured. [[ provide guidance on how to | ||||
| perform matching ]] | ||||
| Parameters sent without a value MUST be treated as if they were | Parameters sent without a value MUST be treated as if they were | |||
| omitted from the request. The authorization server SHOULD ignore | omitted from the request. The authorization server SHOULD ignore | |||
| unrecognized request parameters. | unrecognized request parameters. | |||
| The authorization server validates the request to ensure all required | The authorization server validates the request to ensure all required | |||
| parameters are present and valid. If the request is invalid, the | parameters are present and valid. If the request is invalid, the | |||
| authorization server immediately redirects the user-agent back to the | authorization server redirects the user-agent back to the client | |||
| client using the redirection URI provided with the appropriate error | using the redirection URI provided with the appropriate error code as | |||
| code as described in Section 3.2. | described in Section 4.3. | |||
| The authorization server authenticates the end-user and obtains an | The authorization server authenticates the end-user and obtains an | |||
| authorization decision (by asking the end-user or by establishing | authorization decision (by asking the end-user or by establishing | |||
| approval via other means). When a decision has been established, the | approval via other means). When a decision has been established, the | |||
| authorization server directs the end-user's user-agent to the | authorization server directs the end-user's user-agent to the | |||
| provided client redirection URI using an HTTP redirection response, | provided client redirection URI using an HTTP redirection response, | |||
| or by other means available to it via the end-user's user-agent. | or by other means available to it via the end-user's user-agent. | |||
| 3.1. Authorization Response | 4.2. Authorization Response | |||
| If the end-user grants the access request, the authorization server | If the end-user grants the access request, the authorization server | |||
| issues an access token, an authorization code, or both, and delivers | issues an access token, an authorization code, or both, and delivers | |||
| them to the client by adding the following parameters to the | them to the client by adding the following parameters to the | |||
| redirection URI (as described below): | redirection URI (as described below): | |||
| code | code | |||
| REQUIRED if the response type is "code" or "code_and_token", | REQUIRED if the response type is "code" or "code_and_token", | |||
| otherwise MUST NOT be included. The authorization code | otherwise MUST NOT be included. The authorization code | |||
| generated by the authorization server. The authorization code | generated by the authorization server. The authorization code | |||
| SHOULD expire shortly after it is issued. The authorization | SHOULD expire shortly after it is issued to minimize the risk | |||
| server MUST invalidate the authorization code after a single | of leaks. The client MUST NOT reuse the authorization code. | |||
| usage. The authorization code is bound to the client | If an authorization code is used more than once, the | |||
| identifier and redirection URI. | authorization server MAY revoke all tokens previously issued | |||
| based on that authorization code. The authorization code is | ||||
| bound to the client identifier and redirection URI. | ||||
| access_token | access_token | |||
| REQUIRED if the response type is "token" or "code_and_token", | REQUIRED if the response type is "token" or "code_and_token", | |||
| otherwise MUST NOT be included. The access token issued by the | otherwise MUST NOT be included. The access token issued by the | |||
| authorization server. The access token string MUST comply with | authorization server. | |||
| the access-token rule defined in Section 5.1.1. | ||||
| token_type | ||||
| REQUIRED if the response includes an access token. The type of | ||||
| the token issued. The token type informs the client how the | ||||
| access token is to be used when accessing a protected resource | ||||
| as described in Section 6.1. | ||||
| expires_in | expires_in | |||
| OPTIONAL. The duration in seconds of the access token lifetime | OPTIONAL. The duration in seconds of the access token lifetime | |||
| if an access token is included. For example, the value "3600" | if an access token is included. For example, the value "3600" | |||
| denotes that the access token will expire in one hour from the | denotes that the access token will expire in one hour from the | |||
| time the response was generated by the authorization server. | time the response was generated by the authorization server. | |||
| scope | scope | |||
| OPTIONAL. The scope of the access token as a list of space- | OPTIONAL. The scope of the access token as a list of space- | |||
| delimited strings if an access token is included. The value of | delimited strings if an access token is included. The value of | |||
| skipping to change at page 19, line 32 ¶ | skipping to change at page 23, line 42 ¶ | |||
| parameters to the redirection URI query component using the | parameters to the redirection URI query component using the | |||
| "application/x-www-form-urlencoded" format as defined by | "application/x-www-form-urlencoded" format as defined by | |||
| [W3C.REC-html401-19991224]. | [W3C.REC-html401-19991224]. | |||
| For example, the authorization server redirects the end-user's user- | For example, the authorization server redirects the end-user's user- | |||
| agent by sending the following HTTP response: | agent by sending the following HTTP response: | |||
| HTTP/1.1 302 Found | HTTP/1.1 302 Found | |||
| Location: https://client.example.com/cb?code=i1WsRn1uB1 | Location: https://client.example.com/cb?code=i1WsRn1uB1 | |||
| If the response type is "token", the authorization server adds the | If the response type is "token" or "code_and_token", the | |||
| parameters to the redirection URI fragment component using the | authorization server adds the parameters to the redirection URI | |||
| "application/x-www-form-urlencoded" format as defined by | fragment component using the "application/x-www-form-urlencoded" | |||
| [W3C.REC-html401-19991224]. | format as defined by [W3C.REC-html401-19991224]. | |||
| For example, the authorization server redirects the end-user's user- | ||||
| agent by sending the following HTTP response: | ||||
| HTTP/1.1 302 Found | ||||
| Location: http://example.com/rd#access_token=FJQbwq9&expires_in=3600 | ||||
| If the response type is "code_and_token", the authorization server | ||||
| adds the "code" and "state" parameters to the redirection URI query | ||||
| component and the "access_token", "scope", and "expires_in" to the | ||||
| redirection URI fragment using the | ||||
| "application/x-www-form-urlencoded" format as defined by | ||||
| [W3C.REC-html401-19991224]. | ||||
| For example, the authorization server redirects the end-user's user- | For example, the authorization server redirects the end-user's user- | |||
| agent by sending the following HTTP response (line breaks are for | agent by sending the following HTTP response (URI line breaks are for | |||
| display purposes only): | display purposes only): | |||
| HTTP/1.1 302 Found | HTTP/1.1 302 Found | |||
| Location: http://example.com/rd?code=i1WsRn1uB1 | Location: http://example.com/rd#access_token=FJQbwq9& | |||
| #access_token=FJQbwq9&expires_in=3600 | token_type=example&expires_in=3600 | |||
| Clients SHOULD ignore unrecognized response parameters. The sizes of | Clients SHOULD ignore unrecognized response parameters. The sizes of | |||
| tokens and other values received from the authorization server, are | tokens and other values received from the authorization server, are | |||
| left undefined by this specification. Clients should avoid making | left undefined by this specification. Clients should avoid making | |||
| assumptions about value sizes. Servers should document the expected | assumptions about value sizes. Servers should document the expected | |||
| size of any value they issue. | size of any value they issue. | |||
| 3.2. Error Response | 4.3. Error Response | |||
| If the end-user denies the access request or if the request is | If the end-user denies the access request or if the request fails for | |||
| invalid, the authorization server informs the client by adding the | reasons other than a missing or invalid redirection URI, the | |||
| following parameters to the redirection URI query component using the | authorization server informs the client by adding the following | |||
| parameters to the redirection URI query component using the | ||||
| "application/x-www-form-urlencoded" format as defined by | "application/x-www-form-urlencoded" format as defined by | |||
| [W3C.REC-html401-19991224]: | [W3C.REC-html401-19991224]: | |||
| error | error | |||
| REQUIRED. A single error code as described in Section 3.2.1. | REQUIRED. A single error code as described in Section 4.3.1. | |||
| error_description OPTIONAL. A human-readable text providing | error_description OPTIONAL. A human-readable text providing | |||
| additional information, used to assist in the understanding and | additional information, used to assist in the understanding and | |||
| resolution of the error occurred. | resolution of the error occurred. | |||
| error_uri OPTIONAL. A URI identifying a human-readable web page | error_uri OPTIONAL. A URI identifying a human-readable web page | |||
| with information about the error, used to provide the end-user | with information about the error, used to provide the end-user | |||
| with additional information about the error. | with additional information about the error. | |||
| state | state | |||
| REQUIRED if the "state" parameter was present in the client | REQUIRED if the "state" parameter was present in the client | |||
| authorization request. Set to the exact value received from | authorization request. Set to the exact value received from | |||
| the client. | the client. | |||
| For example, the authorization server redirects the end-user's user- | For example, the authorization server redirects the end-user's user- | |||
| agent by sending the following HTTP response: | agent by sending the following HTTP response: | |||
| HTTP/1.1 302 Found | HTTP/1.1 302 Found | |||
| Location: https://client.example.com/cb?error=access-denied | Location: https://client.example.com/cb?error=access_denied | |||
| 3.2.1. Error Codes | If the request fails due to a missing or invalid redirection URI, the | |||
| authorization server SHOULD inform the end-user of the error, and | ||||
| MUST NOT redirect the end-user's user-agent to the invalid | ||||
| redirection URI. | ||||
| 4.3.1. Error Codes | ||||
| The authorization server includes one of the following error codes | The authorization server includes one of the following error codes | |||
| with the error response: | with the error response: | |||
| invalid_request | invalid_request | |||
| The request is missing a required parameter, includes an | The request is missing a required parameter, includes an | |||
| unsupported parameter or parameter value, or is otherwise | unsupported parameter or parameter value, or is otherwise | |||
| malformed. | malformed. | |||
| invalid_client | invalid_client | |||
| skipping to change at page 21, line 38 ¶ | skipping to change at page 25, line 43 ¶ | |||
| unsupported_response_type | unsupported_response_type | |||
| The requested response type is not supported by the | The requested response type is not supported by the | |||
| authorization server. | authorization server. | |||
| invalid_scope | invalid_scope | |||
| The requested scope is invalid, unknown, or malformed. | The requested scope is invalid, unknown, or malformed. | |||
| [[ Add mechanism for extending error codes ]] | [[ Add mechanism for extending error codes ]] | |||
| 4. Obtaining an Access Token | 5. Obtaining an Access Token | |||
| The client obtains an access token by authenticating with the | The client obtains an access token by authenticating with the | |||
| authorization server and presenting its access grant (in the form of | authorization server and presenting its access grant (in the form of | |||
| an authorization code, resource owner credentials, an assertion, or a | an authorization code, resource owner credentials, an assertion, or a | |||
| refresh token). | refresh token). | |||
| Since requests to the token endpoint result in the transmission of | Since requests to the token endpoint result in the transmission of | |||
| plain text credentials in the HTTP request and response, the | clear-text credentials in the HTTP request and response, the | |||
| authorization server MUST require the use of a transport-layer | authorization server MUST require the use of a transport-layer | |||
| security mechanism when sending requests to the token endpoints. | security mechanism when sending requests to the token endpoints. | |||
| Servers MUST support TLS 1.2 as defined in [RFC5246], and MAY support | Servers MUST support TLS 1.2 as defined in [RFC5246], and MAY support | |||
| additional transport-layer security mechanisms. | additional transport-layer security mechanisms. | |||
| The client requests an access token by making an HTTP "POST" request | The client requests an access token by making an HTTP "POST" request | |||
| to the token endpoint. The location of the token endpoint can be | to the token endpoint. The location of the token endpoint can be | |||
| found in the service documentation, or can be obtained by using [[ | found in the service documentation. The token endpoint URI MAY | |||
| OAuth Discovery ]]. The token endpoint URI MAY include a query | include a query component. | |||
| component. | ||||
| The client authenticates with the authorization server by adding its | The client authenticates with the authorization server by adding its | |||
| client credentials to the request as described in Section 2. The | client credentials to the request as described in Section 3. The | |||
| authorization server MAY allow unauthenticated access token requests | authorization server MAY allow unauthenticated access token requests | |||
| when the client identity does not matter (e.g. anonymous client) or | when the client identity does not matter (e.g. anonymous client) or | |||
| when the client identity is established via other means (e.g. using | when the client identity is established via other means (e.g. using | |||
| an assertion access grant). | an assertion access grant). | |||
| The client constructs the request by including the following | The client constructs the request by including the following | |||
| parameters using the "application/x-www-form-urlencoded" format in | parameters using the "application/x-www-form-urlencoded" format in | |||
| the HTTP request entity-body: | the HTTP request entity-body: | |||
| grant_type | grant_type | |||
| REQUIRED. The access grant type included in the request. | REQUIRED. The access grant type included in the request. | |||
| Value MUST be one of "authorization_code", "password", | Value MUST be one of "authorization_code", "password", | |||
| "assertion", "refresh_token", or "none". | "refresh_token", "client_credentials", or an absolute URI | |||
| identifying an assertion format supported by the authorization | ||||
| client_id | server. | |||
| REQUIRED, unless the client identity can be establish via other | ||||
| means (e.g. assertion). The client identifier as described in | ||||
| Section 2. | ||||
| scope | scope | |||
| OPTIONAL. The scope of the access request expressed as a list | OPTIONAL. The scope of the access request expressed as a list | |||
| of space-delimited strings. The value of the "scope" parameter | of space-delimited strings. The value of the "scope" parameter | |||
| is defined by the authorization server. If the value contains | is defined by the authorization server. If the value contains | |||
| multiple space-delimited strings, their order does not matter, | multiple space-delimited strings, their order does not matter, | |||
| and each string adds an additional access range to the | and each string adds an additional access range to the | |||
| requested scope. If the access grant being used already | requested scope. If the access grant being used already | |||
| represents an approved scope (e.g. authorization code, | represents an approved scope (e.g. authorization code, | |||
| assertion), the requested scope MUST be equal or lesser than | assertion), the requested scope MUST be equal or lesser than | |||
| the scope previously granted. | the scope previously granted, and if omitted is treated as | |||
| equal to the previously approved scope. | ||||
| In addition, the client MUST include the appropriate parameters | In addition, the client MUST include the appropriate parameters | |||
| listed for the selected access grant type as described in | listed for the selected access grant type as described in | |||
| Section 4.1. | Section 5.1. | |||
| Parameters sent without a value MUST be treated as if they were | Parameters sent without a value MUST be treated as if they were | |||
| omitted from the request. The authorization server SHOULD ignore | omitted from the request. The authorization server SHOULD ignore | |||
| unrecognized request parameters. | unrecognized request parameters. | |||
| 4.1. Access Grant Types | 5.1. Access Grant Types | |||
| The client requests an access token using one of the four types of | ||||
| access grants: authorization code, password credentials, assertion, | ||||
| or refresh token. | ||||
| When requesting an access token using the "none" access grant type | The client requests an access token using an authorization code, | |||
| (no access grant is included), the client is requesting access to the | resource owner password credentials, client credentials, refresh | |||
| protected resources under its control, or those of another resource | token, or assertion. | |||
| owner which has been previously arranged with the authorization | ||||
| server (the method of which is beyond the scope of this | ||||
| specification). | ||||
| 4.1.1. Authorization Code | 5.1.1. Authorization Code | |||
| The client includes the authorization code using the | The client includes the authorization code using the | |||
| "authorization_code" access grant type and the following parameters: | "authorization_code" access grant type and the following parameters: | |||
| code | code | |||
| REQUIRED. The authorization code received from the | REQUIRED. The authorization code received from the | |||
| authorization server. | authorization server. | |||
| redirect_uri | redirect_uri | |||
| REQUIRED. The redirection URI used in the initial request. | REQUIRED. The redirection URI used in the initial request. | |||
| For example, the client makes the following HTTP request by including | For example, the client makes the following HTTP request by including | |||
| its client credentials via the "client_secret" parameter described in | its client credentials via the "client_secret" parameter described in | |||
| Section 2 and using transport-layer security (line breaks are for | Section 3 and using transport-layer security (line breaks are for | |||
| display purposes only): | display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
| grant_type=authorization_code&client_id=s6BhdRkqt3& | grant_type=authorization_code&client_id=s6BhdRkqt3& | |||
| client_secret=gX1fBat3bV&code=i1WsRn1uB1& | client_secret=gX1fBat3bV&code=i1WsRn1uB1& | |||
| redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb | |||
| The authorization server MUST: | The authorization server MUST: | |||
| o Validate the client credentials (if present) and ensure they match | o Validate the client credentials (if present) and ensure they match | |||
| the authorization code. | the authorization code. | |||
| o Verify that the authorization code and redirection URI are all | o Verify that the authorization code and redirection URI are all | |||
| valid and match its stored association. | valid and match its stored association. | |||
| If the request is valid, the authorization server issues a successful | If the request is valid, the authorization server issues a successful | |||
| response as described in Section 4.2. | response as described in Section 5.2. | |||
| 4.1.2. Resource Owner Password Credentials | 5.1.2. Resource Owner Password Credentials | |||
| The client includes the resource owner credentials using the | The client includes the resource owner credentials using the | |||
| "password" access grant type and the following parameters: [[ add | "password" access grant type and the following parameters: [[ add | |||
| internationalization consideration for username and password ]] | internationalization consideration for username and password ]] | |||
| username | username | |||
| REQUIRED. The resource owner's username. | REQUIRED. The resource owner's username. | |||
| password | password | |||
| REQUIRED. The resource owner's password. | REQUIRED. The resource owner's password. | |||
| For example, the client makes the following HTTP request by including | For example, the client makes the following HTTP request by including | |||
| its client credentials via the "client_secret" parameter described in | its client credentials via the "client_secret" parameter described in | |||
| Section 2 and using transport-layer security (line breaks are for | Section 3 and using transport-layer security (line breaks are for | |||
| display purposes only): | display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
| grant_type=password&client_id=s6BhdRkqt3& | grant_type=password&client_id=s6BhdRkqt3& | |||
| client_secret=47HDu8s&username=johndoe&password=A3ddj3w | client_secret=47HDu8s&username=johndoe&password=A3ddj3w | |||
| The authorization server MUST validate the client credentials (if | The authorization server MUST validate the client credentials (if | |||
| present) and end-user credentials and if valid issue an access token | present) and end-user credentials and if valid issue an access token | |||
| response as described in Section 4.2. | response as described in Section 5.2. | |||
| 4.1.3. Assertion | ||||
| The client includes the assertion using the "assertion" access grant | ||||
| type and the following parameters: | ||||
| assertion_type | ||||
| REQUIRED. The format of the assertion as defined by the | ||||
| authorization server. The value MUST be an absolute URI. | ||||
| assertion | ||||
| REQUIRED. The assertion. | ||||
| For example, the client makes the following HTTP request using | ||||
| transport-layer security, and client authentication is achieved via | ||||
| the assertion (line breaks are for display purposes only): | ||||
| POST /token HTTP/1.1 | ||||
| Host: server.example.com | ||||
| Content-Type: application/x-www-form-urlencoded | ||||
| grant_type=assertion& | ||||
| assertion_type=urn%3Aoasis%3Anames%3Atc%3ASAML%3A2.0%3Aassertion& | ||||
| assertion=PHNhbWxwOl...[omitted for brevity]...ZT4%3D | ||||
| The authorization server MUST validate the client credentials (if | 5.1.3. Client Credentials | |||
| present) and the assertion and if valid issues an access token | ||||
| response as described in Section 4.2. The authorization server | ||||
| SHOULD NOT issue a refresh token (instead, require the client to use | ||||
| the same or new assertion). | ||||
| Authorization servers SHOULD issue access tokens with a limited | The client can request an access token using only its client | |||
| lifetime and require clients to refresh them by requesting a new | credentials using the "client_credentials" access grant type. When | |||
| access token using the same assertion if it is still valid. | omitting an explicit access grant, the client is requesting access to | |||
| Otherwise the client MUST obtain a new valid assertion. | the protected resources under its control, or those of another | |||
| resource owner which has been previously arranged with the | ||||
| authorization server (the method of which is beyond the scope of this | ||||
| specification). | ||||
| 4.1.4. Refresh Token | 5.1.4. Refresh Token | |||
| The client includes the refresh token using the "refresh_token" | The client includes the refresh token using the "refresh_token" | |||
| access grant type and the following parameter: | access grant type and the following parameter: | |||
| refresh_token | refresh_token | |||
| REQUIRED. The refresh token associated with the access token | REQUIRED. The refresh token associated with the access token | |||
| to be refreshed. | to be refreshed. | |||
| For example, the client makes the following HTTP request by including | For example, the client makes the following HTTP request by including | |||
| its client credentials via the "client_secret" parameter described in | its client credentials via the "client_secret" parameter described in | |||
| Section 2 and using transport-layer security (line breaks are for | Section 3 and using transport-layer security (line breaks are for | |||
| display purposes only): | display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
| grant_type=refresh_token&client_id=s6BhdRkqt3& | grant_type=refresh_token&client_id=s6BhdRkqt3& | |||
| client_secret=8eSEIpnqmM&refresh_token=n4E9O119d | client_secret=8eSEIpnqmM&refresh_token=n4E9O119d | |||
| The authorization server MUST verify the client credentials (if | The authorization server MUST verify the client credentials (if | |||
| present), the validity of the refresh token, and that the resource | present), the validity of the refresh token, and that the resource | |||
| owner's authorization is still valid. If the request is valid, the | owner's authorization is still valid. If the request is valid, the | |||
| authorization server issues an access token response as described in | authorization server issues an access token response as described in | |||
| Section 4.2. The authorization server MAY issue a new refresh token. | Section 5.2. The authorization server MAY issue a new refresh token, | |||
| in which case, the client MUST discard the old refresh token and | ||||
| replace it with the new refresh token. | ||||
| 4.2. Access Token Response | 5.1.5. Assertion | |||
| The client includes an assertion by specifying the assertion format | ||||
| using an absolute URI (as defined by the authorization server) as the | ||||
| value of the "grant_type" parameter and by adding the following | ||||
| parameter: | ||||
| assertion | ||||
| REQUIRED. The assertion. | ||||
| For example, the client makes the following HTTP request using | ||||
| transport-layer security, and client authentication is achieved via | ||||
| the assertion (line breaks are for display purposes only): | ||||
| POST /token HTTP/1.1 | ||||
| Host: server.example.com | ||||
| Content-Type: application/x-www-form-urlencoded | ||||
| grant_type=urn%3Aoasis%3Anames%3Atc%3ASAML%3A2.0%3Aassertion& | ||||
| assertion=PHNhbWxwOl[...omitted for brevity...]ZT4%3D | ||||
| The authorization server MUST validate the client credentials (if | ||||
| present) and the assertion and if valid issues an access token | ||||
| response as described in Section 5.2. The authorization server | ||||
| SHOULD NOT issue a refresh token (instead, it should require the | ||||
| client to use the same or new assertion). | ||||
| Authorization servers SHOULD issue access tokens with a limited | ||||
| lifetime and require clients to refresh them by requesting a new | ||||
| access token using the same assertion if it is still valid. | ||||
| Otherwise the client MUST obtain a new valid assertion. | ||||
| 5.2. Access Token Response | ||||
| After receiving and verifying a valid and authorized access token | After receiving and verifying a valid and authorized access token | |||
| request from the client, the authorization server issues the access | request from the client, the authorization server issues the access | |||
| token and optional refresh token, and constructs the response by | token and optional refresh token, and constructs the response by | |||
| adding the following parameters to the entity body of the HTTP | adding the following parameters to the entity body of the HTTP | |||
| response with a 200 (OK) status code: | response with a 200 (OK) status code: | |||
| The token response contains the following parameters: | The token response contains the following parameters: | |||
| access_token | access_token | |||
| REQUIRED. The access token issued by the authorization server. | REQUIRED. The access token issued by the authorization server. | |||
| The access token string MUST comply with the access-token rule | ||||
| defined in Section 5.1.1. | token_type | |||
| REQUIRED. The type of the token issued. The token type | ||||
| informs the client how the access token is to be used when | ||||
| accessing a protected resource as described in Section 6.1. | ||||
| expires_in | expires_in | |||
| OPTIONAL. The duration in seconds of the access token | OPTIONAL. The duration in seconds of the access token | |||
| lifetime. For example, the value "3600" denotes that the | lifetime. For example, the value "3600" denotes that the | |||
| access token will expire in one hour from the time the response | access token will expire in one hour from the time the response | |||
| was generated by the authorization server. | was generated by the authorization server. | |||
| refresh_token | refresh_token | |||
| OPTIONAL. The refresh token used to obtain new access tokens | OPTIONAL. The refresh token used to obtain new access tokens | |||
| using the same end-user access grant as described in | using the same end-user access grant as described in | |||
| Section 4.1.4. The authorization server SHOULD NOT issue a | Section 5.1.4. The authorization server SHOULD NOT issue a | |||
| refresh token when the access grant type is set to "none". | refresh token when the access grant type is an assertion or a | |||
| set of client credentials. | ||||
| scope | scope | |||
| OPTIONAL. The scope of the access token as a list of space- | OPTIONAL. The scope of the access token as a list of space- | |||
| delimited strings. The value of the "scope" parameter is | delimited strings. The value of the "scope" parameter is | |||
| defined by the authorization server. If the value contains | defined by the authorization server. If the value contains | |||
| multiple space-delimited strings, their order does not matter, | multiple space-delimited strings, their order does not matter, | |||
| and each string adds an additional access range to the | and each string adds an additional access range to the | |||
| requested scope. The authorization server SHOULD include the | requested scope. The authorization server SHOULD include the | |||
| parameter if the requested scope is different from the one | parameter if the requested scope is different from the one | |||
| requested by the client. | requested by the client. | |||
| skipping to change at page 27, line 18 ¶ | skipping to change at page 31, line 24 ¶ | |||
| containing tokens, secrets, or other sensitive information. | containing tokens, secrets, or other sensitive information. | |||
| For example: | For example: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Cache-Control: no-store | Cache-Control: no-store | |||
| { | { | |||
| "access_token":"SlAV32hkKG", | "access_token":"SlAV32hkKG", | |||
| "token_type":"example", | ||||
| "expires_in":3600, | "expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8" | "refresh_token":"8xLOxBtZp8" | |||
| } | } | |||
| Clients SHOULD ignore unrecognized response parameters. The sizes of | Clients SHOULD ignore unrecognized response parameters. The sizes of | |||
| tokens and other values received from the authorization server, are | tokens and other values received from the authorization server, are | |||
| left undefined by this specification. Clients should avoid making | left undefined by this specification. Clients should avoid making | |||
| assumptions about value sizes. Servers should document the expected | assumptions about value sizes. Servers should document the expected | |||
| size of any value they issue. | size of any value they issue. | |||
| 4.3. Error Response | 5.3. Error Response | |||
| If the token request is invalid or unauthorized, the authorization | If the token request is invalid or unauthorized, the authorization | |||
| server constructs the response by adding the following parameter to | server constructs the response by adding the following parameter to | |||
| the entity body of the HTTP response using the "application/json" | the entity body of the HTTP response using the "application/json" | |||
| media type: | media type: | |||
| error | error | |||
| REQUIRED. A single error code as described in Section 4.3.1. | REQUIRED. A single error code as described in Section 5.3.1. | |||
| error_description OPTIONAL. A human-readable text providing | error_description OPTIONAL. A human-readable text providing | |||
| additional information, used to assist in the understanding and | additional information, used to assist in the understanding and | |||
| resolution of the error occurred. | resolution of the error occurred. | |||
| error_uri OPTIONAL. A URI identifying a human-readable web page | error_uri OPTIONAL. A URI identifying a human-readable web page | |||
| with information about the error, used to provide the end-user | with information about the error, used to provide the end-user | |||
| with additional information about the error. | with additional information about the error. | |||
| For example: | For example: | |||
| skipping to change at page 28, line 21 ¶ | skipping to change at page 32, line 25 ¶ | |||
| { | { | |||
| "error":"invalid_request" | "error":"invalid_request" | |||
| } | } | |||
| If the client provided invalid credentials using an HTTP | If the client provided invalid credentials using an HTTP | |||
| authentication scheme via the "Authorization" request header field, | authentication scheme via the "Authorization" request header field, | |||
| the authorization server MUST respond with the HTTP 401 | the authorization server MUST respond with the HTTP 401 | |||
| (Unauthorized) status code. Otherwise, the authorization server | (Unauthorized) status code. Otherwise, the authorization server | |||
| SHALL respond with the HTTP 400 (Bad Request) status code. | SHALL respond with the HTTP 400 (Bad Request) status code. | |||
| 4.3.1. Error Codes | 5.3.1. Error Codes | |||
| The authorization server includes one of the following error codes | The authorization server includes one of the following error codes | |||
| with the error response: | with the error response: | |||
| invalid_request | invalid_request | |||
| The request is missing a required parameter, includes an | The request is missing a required parameter, includes an | |||
| unsupported parameter or parameter value, repeats a parameter, | unsupported parameter or parameter value, repeats a parameter, | |||
| includes multiple credentials, utilizes more than one mechanism | includes multiple credentials, utilizes more than one mechanism | |||
| for authenticating the client, or is otherwise malformed. | for authenticating the client, or is otherwise malformed. | |||
| skipping to change at page 29, line 15 ¶ | skipping to change at page 33, line 15 ¶ | |||
| unsupported_grant_type | unsupported_grant_type | |||
| The access grant included - its type or another attribute - is | The access grant included - its type or another attribute - is | |||
| not supported by the authorization server. | not supported by the authorization server. | |||
| invalid_scope | invalid_scope | |||
| The requested scope is invalid, unknown, malformed, or exceeds | The requested scope is invalid, unknown, malformed, or exceeds | |||
| the previously granted scope. | the previously granted scope. | |||
| [[ Add mechanism for extending error codes ]] | [[ Add mechanism for extending error codes ]] | |||
| 5. Accessing a Protected Resource | 6. Accessing a Protected Resource | |||
| Clients access protected resources by presenting an access token to | Clients access protected resources by presenting an access token to | |||
| the resource server. Access tokens act as bearer tokens, where the | the resource server. The resource server MUST validate the access | |||
| token string acts as a shared symmetric secret. This requires | token and ensure it has not expired and that its scope covers the | |||
| treating the access token with the same care as other secrets (e.g. | requested resource. The methods used by the resource server to | |||
| end-user passwords). Access tokens SHOULD NOT be sent in the clear | validate the access token are beyond the scope of this specification, | |||
| over an insecure channel. | but generally involve an interaction or coordination between the | |||
| resource server and authorization server. | ||||
| However, when it is necessary to transmit access tokens in the clear | ||||
| without a secure channel, authorization servers SHOULD issue access | ||||
| tokens with limited scope and lifetime to reduce the potential risk | ||||
| from a compromised access token. | ||||
| Clients MUST NOT make authenticated requests with an access token to | ||||
| unfamiliar resource servers, regardless of the presence of a secure | ||||
| channel. | ||||
| The resource server MUST validate the access token and ensure it has | ||||
| not expired and that its scope covers the requested resource. The | ||||
| methods used by the resource server to validate the access token are | ||||
| beyond the scope of this specification, but generally involve an | ||||
| interaction or coordination between the resource server and | ||||
| authorization server. | ||||
| 5.1. Authenticated Requests | ||||
| Clients make authenticated token requests using the "Authorization" | ||||
| request header field. Resource servers MUST accept authenticated | ||||
| requests using the "OAuth" HTTP authentication scheme as described in | ||||
| Section 5.1.1, and MAY support additional methods. | ||||
| Alternatively, clients MAY attempt to include the access token using | ||||
| the HTTP request URI in the query component as described in | ||||
| Section 5.1.2, or in the HTTP body when using the | ||||
| "application/x-www-form-urlencoded" content type as described in | ||||
| Section 5.1.3. Resource server MAY support these alternative | ||||
| methods. | ||||
| Clients SHOULD only use the request URI or body when the | ||||
| "Authorization" request header field is not available, and MUST NOT | ||||
| use more than one method in each request. | ||||
| 5.1.1. The Authorization Request Header Field | ||||
| The "Authorization" request header field is used by clients to make | ||||
| authenticated token requests. The client uses the "OAuth" | ||||
| authentication scheme to include the access token in the request. | ||||
| For example: | ||||
| GET /resource HTTP/1.1 | ||||
| Host: server.example.com | ||||
| Authorization: OAuth vF9dft4qmT | ||||
| The "Authorization" header field uses the framework defined by | ||||
| [RFC2617] as follows: | ||||
| credentials = "OAuth" RWS access-token [ CS 1#auth-param ] | ||||
| access-token = 1*( quoted-char / <"> ) | ||||
| CS = OWS "," OWS | ||||
| quoted-char = "!" / "#" / "$" / "%" / "&" / "'" / "(" | ||||
| / ")" / "*" / "+" / "-" / "." / "/" / DIGIT | ||||
| / ":" / "<" / "=" / ">" / "?" / "@" / ALPHA | ||||
| / "[" / "]" / "^" / "_" / "`" / "{" / "|" | ||||
| / "}" / "~" / "\" / "," / ";" | ||||
| NOTE: [RFC5849] defines a different format for the "OAuth" | ||||
| authentication scheme. Resource servers can differentiate between | ||||
| the two protocol versions based on the presence of the | ||||
| "oauth_signature_method" which is REQUIRED in the previous version | ||||
| and is not supported by this specification. | ||||
| 5.1.2. URI Query Parameter | ||||
| When including the access token in the HTTP request URI, the client | ||||
| adds the access token to the request URI query component as defined | ||||
| by [RFC3986] using the "oauth_token" parameter. | ||||
| For example, the client makes the following HTTP request using | ||||
| transport-layer security: | ||||
| GET /resource?oauth_token=vF9dft4qmT HTTP/1.1 | ||||
| Host: server.example.com | ||||
| The HTTP request URI query can include other request-specific | ||||
| parameters, in which case, the "oauth_token" parameters SHOULD be | ||||
| appended following the request-specific parameters, properly | ||||
| separated by an "&" character (ASCII code 38). | ||||
| For example: | ||||
| http://example.com/resource?x=y&oauth_token=vF9dft4qmT | ||||
| NOTE: The "oauth_token" parameter is used by the previous version | ||||
| of the OAuth protocol as described in [RFC5849]. Resource servers | ||||
| can differentiate between the two protocol versions based on the | ||||
| presence of the "oauth_signature_method" which is REQUIRED in the | ||||
| previous version and is not supported by this specification. | ||||
| 5.1.3. Form-Encoded Body Parameter | ||||
| When including the access token in the HTTP request entity-body, the | ||||
| client adds the access token to the request body using the | ||||
| "oauth_token" parameter. The client can use this method only if the | ||||
| following REQUIRED conditions are met: | ||||
| o The entity-body is single-part. | ||||
| o The entity-body follows the encoding requirements of the | ||||
| "application/x-www-form-urlencoded" content-type as defined by | ||||
| [W3C.REC-html401-19991224]. | ||||
| o The HTTP request entity-header includes the "Content-Type" header | ||||
| field set to "application/x-www-form-urlencoded". | ||||
| o The HTTP request method is "POST", "PUT", or "DELETE". | ||||
| The entity-body can include other request-specific parameters, in | The method in which the client utilized the access token to | |||
| which case, the "oauth_token" parameters SHOULD be appended following | authenticate with the resource server depends on the type of access | |||
| the request-specific parameters, properly separated by an "&" | token issued by the authorization server. | |||
| character (ASCII code 38). | ||||
| For example, the client makes the following HTTP request using | 6.1. Access Token Types | |||
| transport-layer security: | ||||
| POST /resource HTTP/1.1 | [[ add token type explanation, maybe with links to other token specs | |||
| Host: server.example.com | ]] | |||
| Content-Type: application/x-www-form-urlencoded | ||||
| oauth_token=vF9dft4qmT | 6.2. The WWW-Authenticate Response Header Field | |||
| NOTE: The "oauth_token" parameter is used by the previous version | If the protected resource request does not include authentication | |||
| of the OAuth protocol as described in [RFC5849]. Resource servers | credentials, contains an invalid access token, or is malformed, the | |||
| can differentiate between the two protocol versions based on the | resource server MUST include the HTTP "WWW-Authenticate" response | |||
| presence of the "oauth_signature_method" which is REQUIRED in the | header field. The "WWW-Authenticate" header field uses the framework | |||
| previous version and is not supported by this specification. | defined by [RFC2617] as follows: | |||
| 5.2. The WWW-Authenticate Response Header Field | challenge = "OAuth2" [ RWS 1#param ] | |||
| If the protected resource request contains an invalid access token or | param = scope / | |||
| is malformed, the resource server MUST include the HTTP | error / error-desc / error-uri / | |||
| "WWW-Authenticate" response header field. The "WWW-Authenticate" | ( token "=" ( token / quoted-string ) ) | |||
| header field uses the framework defined by [RFC2617] as follows: | ||||
| challenge = "OAuth" RWS token-challenge | scope = "scope" "=" <"> scope-v *( SP scope-v ) <"> | |||
| scope-v = 1*quoted-char | ||||
| token-challenge = realm | quoted-char = ALPHA / DIGIT / | |||
| [ CS error ] | "!" / "#" / "$" / "%" / "&" / "'" / "(" / ")" / | |||
| [ CS error-desc ] | "*" / "+" / "-" / "." / "/" / ":" / "<" / "=" / | |||
| [ CS error-uri ] | ">" / "?" / "@" / "[" / "]" / "^" / "_" / "`" / | |||
| [ CS scope ] | "{" / "|" / "}" / "~" / "\" / "," / ";" | |||
| [ CS 1#auth-param ] | ||||
| error = "error" "=" <"> token <"> | error = "error" "=" quoted-string | |||
| error-desc = "error_description" "=" quoted-string | error-desc = "error_description" "=" quoted-string | |||
| error-uri = "error_uri" = <"> URI-Reference <"> | error-uri = "error_uri" = <"> URI-reference <"> | |||
| scope = quoted-value / | ||||
| <"> quoted-value *( 1*SP quoted-value ) <"> | ||||
| quoted-value = 1*quoted-char | ||||
| For example: | The "scope" attribute is a space-delimited list of scope values | |||
| indicating the required scope of the access token for accessing the | ||||
| requested resource. The "scope" attribute MUST NOT appear more than | ||||
| once. | ||||
| HTTP/1.1 401 Unauthorized | If the protected resource request included an access token and failed | |||
| WWW-Authenticate: OAuth realm='Example Service', error='expired-token' | authentication, the resource server SHOULD include the "error" | |||
| The "realm" attribute is used to provide the protected resources | attribute to provide the client with the reason why the access | |||
| partition as defined by [RFC2617]. [[ add explanation ]] | request was declined. The parameter value is described in | |||
| Section 6.2.1. In addition, the resource server MAY include the | ||||
| "error_description" attribute to provide a human-readable | ||||
| explanation, and the "error-uri" attribute with an absolute URI | ||||
| identifying a human-readable web page explaining the error. The | ||||
| "error", "error_description", and "error_uri" attribute MUST NOT | ||||
| appear more than once. | ||||
| The "error" attribute is used to provide the client with the reason | For example, in response to a protected resource request without | |||
| why the access request was declined. The parameter values are | authentication: | |||
| described in Section 5.2.1. | ||||
| The "error_description" attribute provides a human-readable text | HTTP/1.1 401 Unauthorized | |||
| containing additional information, used to assist in the | WWW-Authenticate: OAuth2 | |||
| understanding and resolution of the error occurred. | ||||
| The "error_uri" attribute provides a URI identifying a human-readable | And in response to a protected resource request with an | |||
| web page with information about the error, used to offer the end-user | authentication attempt using an expired access token: | |||
| with additional information about the error. If the value is not an | ||||
| absolute URI, it is relative to the URI of the requested protected | ||||
| resource. | ||||
| The "scope" attribute is a space-delimited list of scope values | HTTP/1.1 401 Unauthorized | |||
| indicating the required scope of the access token for accessing the | WWW-Authenticate: OAuth2 | |||
| requested resource. | error="invalid_token", | |||
| error_description="The access token expired" | ||||
| 5.2.1. Error Codes | 6.2.1. Error Codes | |||
| The authorization server includes one of the following error codes | When a request fails, the resource server responds using the | |||
| with the error response: | appropriate HTTP status code (typically, 400, 401, or 403), and | |||
| includes one of the following error codes in the response: | ||||
| invalid_request | invalid_request | |||
| The request is missing a required parameter, includes an | The request is missing a required parameter, includes an | |||
| unsupported parameter or parameter value, repeats the same | unsupported parameter or parameter value, repeats the same | |||
| parameter, uses more than one method for including an access | parameter, uses more than one method for including an access | |||
| token, or is otherwise malformed. The resource server MUST | token, or is otherwise malformed. The resource server SHOULD | |||
| respond with the HTTP 400 (Bad Request) status code. | respond with the HTTP 400 (Bad Request) status code. | |||
| invalid_token | invalid_token | |||
| The access token provided is invalid. Resource servers SHOULD | The access token provided is expired, revoked, malformed, or | |||
| use this error code when receiving an expired token which | invalid for other reasons. The resource SHOULD respond with | |||
| cannot be refreshed to indicate to the client that a new | the HTTP 401 (Unauthorized) status code. The client MAY | |||
| authorization is necessary. The resource server MUST respond | request a new access token and retry the protected resource | |||
| with the HTTP 401 (Unauthorized) status code. | request. | |||
| expired_token | ||||
| The access token provided has expired. Resource servers SHOULD | ||||
| only use this error code when the client is expected to be able | ||||
| to handle the response and request a new access token using the | ||||
| refresh token issued with the expired access token. The | ||||
| resource server MUST respond with the HTTP 401 (Unauthorized) | ||||
| status code. | ||||
| insufficient_scope | insufficient_scope | |||
| The request requires higher privileges than provided by the | The request requires higher privileges than provided by the | |||
| access token. The resource server SHOULD respond with the HTTP | access token. The resource server SHOULD respond with the HTTP | |||
| 403 (Forbidden) status code and MAY include the "scope" | 403 (Forbidden) status code and MAY include the "scope" | |||
| attribute with the scope necessary to access the protected | attribute with the scope necessary to access the protected | |||
| resource. | resource. | |||
| [[ Add mechanism for extending error codes ]] | [[ Add mechanism for extending error codes ]] | |||
| If the request lacks any authentication information (i.e. the client | If the request lacks any authentication information (i.e. the client | |||
| was unaware authentication is necessary or attempted using an | was unaware authentication is necessary or attempted using an | |||
| unsupported authentication method), the resource server SHOULD not | unsupported authentication method), the resource server SHOULD not | |||
| include an error code or other error information. | include an error code or other error information. | |||
| For example: | For example: | |||
| HTTP/1.1 401 Unauthorized | HTTP/1.1 401 Unauthorized | |||
| WWW-Authenticate: OAuth realm='Example Service' | WWW-Authenticate: OAuth2 | |||
| 6. Extensibility | 7. Extensibility | |||
| 6.1. Defining New Client Credentials Types | 7.1. Defining New Client Credentials Types | |||
| [[ TBD ]] | [[ TBD ]] | |||
| 6.2. Defining New Endpoint Parameters | 7.2. Defining New Endpoint Parameters | |||
| Applications that wish to define new request or response parameters | Applications that wish to define new request or response parameters | |||
| for use with the end-user authorization endpoint or the token | for use with the end-user authorization endpoint or the token | |||
| endpoint SHALL do so in one of two ways: register them in the | endpoint SHALL do so in one of two ways: register them in the | |||
| parameters registry (following the procedures in Section 8.1), or use | parameters registry (following the procedures in Section 9.1), or use | |||
| the "x_" parameter name prefix. | the "x_" parameter name prefix. | |||
| Parameters utilizing the "x_" parameter name prefix MUST be limited | Parameters utilizing the "x_" parameter name prefix MUST be limited | |||
| to vendor-specific extensions that are not commonly applicable, and | to vendor-specific extensions that are not commonly applicable, and | |||
| are specific to the implementation details of the authorization | are specific to the implementation details of the authorization | |||
| server where they are used. All other new parameters MUST be | server where they are used. All other new parameters MUST be | |||
| registered, and MUST NOT use the "x_" parameter name prefix. | registered, and MUST NOT use the "x_" parameter name prefix. | |||
| Parameter names MUST conform to the param-name ABNF, and parameter | Parameter names MUST conform to the param-name ABNF, and parameter | |||
| values syntax MUST be well-defined (e.g., using ABNF, or a reference | values syntax MUST be well-defined (e.g., using ABNF, or a reference | |||
| to the syntax of an existing parameter). | to the syntax of an existing parameter). | |||
| param-name = 1*name-char | param-name = 1*name-char | |||
| name-char = "-" / "." / "_" / DIGIT / ALPHA | name-char = "-" / "." / "_" / DIGIT / ALPHA | |||
| 6.3. Defining New Header Field Parameters | 7.3. Defining New Header Field Parameters | |||
| Applications that wish to define new parameters for use in the OAuth | Applications that wish to define new parameters for use in the OAuth | |||
| "Authorization" or "WWW-Authenticate" header fields MUST register | "WWW-Authenticate" header field MUST register them in the parameters | |||
| them in the parameters registry, following the procedures in | registry, following the procedures in Section 9.1. | |||
| Section 8.1. | ||||
| Parameter names MUST conform to the param-name ABNF and MUST NOT | Parameter names MUST conform to the param-name ABNF and MUST NOT | |||
| begin with "x_". Parameter values MUST conform to the param-value | begin with "x_". Parameter values MUST conform to the param-value | |||
| ABNF and their syntax MUST be well-defined (e.g., using ABNF, or a | ABNF and their syntax MUST be well-defined (e.g., using ABNF, or a | |||
| reference to the syntax of an existing parameter). | reference to the syntax of an existing parameter). | |||
| param-value = quoted-value | quoted-string | param-value = quoted-value | quoted-string | |||
| 6.4. Defining New Access Grant Types | 7.4. Defining New Access Grant Types | |||
| The assertion access grant type was designed to allow the | The assertion access grant type allows the authorization server to | |||
| authorization server to accept additional access grants not | accept additional access grants not specified. Applications that | |||
| specified. Applications that wish to define additional access grant | wish to define additional access grant types can do so by utilizing a | |||
| types can do so by utilizing a new or existing assertion type and | new or existing assertion type and format. | |||
| format. | ||||
| 7. Security Considerations | 8. Security Considerations | |||
| [[ TBD ]] | [[ TBD ]] | |||
| 8. IANA Considerations | 9. IANA Considerations | |||
| 8.1. The OAuth Parameters Registry | 9.1. The OAuth Parameters Registry | |||
| This document establishes the OAuth parameters registry. | This document establishes the OAuth parameters registry. | |||
| Additional parameters to be use in the end-user authorization | Additional parameters to be use in the end-user authorization | |||
| endpoint request, the end-user authorization endpoint response, the | endpoint request, the end-user authorization endpoint response, the | |||
| token endpoint request, the token endpoint response, the | token endpoint request, the token endpoint response, or the | |||
| "Authorization" header field, or the "WWW-Authenticate" header field, | "WWW-Authenticate" header field, are registered on the advice of one | |||
| are registered on the advice of one or more Designated Experts | or more Designated Experts (appointed by the IESG or their delegate), | |||
| (appointed by the IESG or their delegate), with a Specification | with a Specification Required (using terminology from [RFC5226]). | |||
| Required (using terminology from [RFC5226]). However, to allow for | However, to allow for the allocation of values prior to publication, | |||
| the allocation of values prior to publication, the Designated | the Designated Expert(s) may approve registration once they are | |||
| Expert(s) may approve registration once they are satisfied that such | satisfied that such a specification will be published. | |||
| a specification will be published. | ||||
| Registration requests should be sent to the [TBD]@ietf.org mailing | Registration requests should be sent to the [TBD]@ietf.org mailing | |||
| list for review and comment, with an appropriate subject (e.g., | list for review and comment, with an appropriate subject (e.g., | |||
| "Request for parameter: example"). [[ Note to RFC-EDITOR: The name of | "Request for parameter: example"). [[ Note to RFC-EDITOR: The name of | |||
| the mailing list should be determined in consultation with the IESG | the mailing list should be determined in consultation with the IESG | |||
| and IANA. Suggested name: oauth-ext-review. ]] | and IANA. Suggested name: oauth-ext-review. ]] | |||
| Before a period of 14 days has passed, the Designated Expert(s) will | Before a period of 14 days has passed, the Designated Expert(s) will | |||
| either approve or deny the registration request, communicating this | either approve or deny the registration request, communicating this | |||
| decision both to the review list and to IANA. Denials should include | decision both to the review list and to IANA. Denials should include | |||
| an explanation and, if applicable, suggestions as to how to make the | an explanation and, if applicable, suggestions as to how to make the | |||
| request successful. Registration requests that are undetermined for | request successful. Registration requests that are undetermined for | |||
| a period longer than 21 days can be brought to the IESG's attention | a period longer than 21 days can be brought to the IESG's attention | |||
| (using the iesg@iesg.org mailing list) for resolution. | (using the iesg@iesg.org mailing list) for resolution. | |||
| 8.1.1. Registration Template | 9.1.1. Registration Template | |||
| Parameter name: The name requested (e.g., "example"). | Parameter name: The name requested (e.g., "example"). | |||
| Parameter usage location: The location(s) where parameter can be | Parameter usage location: The location(s) where parameter can be | |||
| used. The possible locations are: the end-user authorization | used. The possible locations are: the end-user authorization | |||
| endpoint request, the end-user authorization endpoint response, | endpoint request, the end-user authorization endpoint response, | |||
| the token endpoint request, the token endpoint response, the | the token endpoint request, the token endpoint response, the or | |||
| "Authorization" header field, or the "WWW-Authenticate" header | the "WWW-Authenticate" header field. | |||
| field. | ||||
| Change controller: For standards-track RFCs, state "IETF". For | Change controller: For standards-track RFCs, state "IETF". For | |||
| others, give the name of the responsible party. Other details | others, give the name of the responsible party. Other details | |||
| (e.g., postal address, e-mail address, home page URI) may also be | (e.g., postal address, e-mail address, home page URI) may also be | |||
| included. | included. | |||
| Specification document(s): Reference to document that specifies the | Specification document(s): Reference to document that specifies the | |||
| parameter, preferably including a URI that can be used to retrieve | parameter, preferably including a URI that can be used to retrieve | |||
| a copy of the document. An indication of the relevant sections | a copy of the document. An indication of the relevant sections | |||
| may also be included, but is not required. | may also be included, but is not required. | |||
| Related information: Optionally, citations to additional documents | Related information: Optionally, citations to additional documents | |||
| containing further relevant information. | containing further relevant information. | |||
| 8.1.2. Example | 9.1.2. Example | |||
| The following is the parameter registration request for the "scope" | The following is the parameter registration request for the "scope" | |||
| parameter as defined in this specification: | parameter as defined in this specification: | |||
| Parameter name: scope | Parameter name: scope | |||
| Parameter usage location: The end-user authorization endpoint | Parameter usage location: The end-user authorization endpoint | |||
| request, the end-user authorization endpoint response, the token | request, the end-user authorization endpoint response, the token | |||
| endpoint request, the token endpoint response, and the | endpoint request, the token endpoint response, and the | |||
| "WWW-Authenticate" header field. | "WWW-Authenticate" header field. | |||
| skipping to change at page 37, line 37 ¶ | skipping to change at page 39, line 16 ¶ | |||
| Luke Shepard (Facebook), and Allen Tom (Yahoo!). The content and | Luke Shepard (Facebook), and Allen Tom (Yahoo!). The content and | |||
| concepts within are a product of the OAuth community, WRAP community, | concepts within are a product of the OAuth community, WRAP community, | |||
| and the OAuth Working Group. | and the OAuth Working Group. | |||
| The OAuth Working Group has dozens of very active contributors who | The OAuth Working Group has dozens of very active contributors who | |||
| proposed ideas and wording for this document, including: [[ If your | proposed ideas and wording for this document, including: [[ If your | |||
| name is missing or you think someone should be added here, please | name is missing or you think someone should be added here, please | |||
| send Eran a note - don't be shy ]] | send Eran a note - don't be shy ]] | |||
| Michael Adams, Andrew Arnott, Dirk Balfanz, Brian Campbell, Leah | Michael Adams, Andrew Arnott, Dirk Balfanz, Brian Campbell, Leah | |||
| Culver, Brian Ellin, Igor Faynberg, George Fletcher, Evan Gilbert, | Culver, Bill de hOra, Brian Ellin, Igor Faynberg, George Fletcher, | |||
| Justin Hart, John Kemp, Chasen Le Hara, Torsten Lodderstedt, Eve | Tim Freeman, Evan Gilbert, Kristoffer Gronowski, Justin Hart, Mike | |||
| Maler, James Manger, Laurence Miao, Chuck Mortimore, Justin Richer, | Jones, John Kemp, Chasen Le Hara, Torsten Lodderstedt, Alastair Mair, | |||
| Peter Saint-Andre, Nat Sakimura, Rob Sayre, Marius Scurtescu, Justin | Eve Maler, James Manger, Laurence Miao, Chuck Mortimore, Justin | |||
| Smith, Jeremy Suriel, and Franklin Tse. | Richer, Peter Saint-Andre, Nat Sakimura, Rob Sayre, Marius Scurtescu, | |||
| Naitik Shah, Justin Smith, Jeremy Suriel, Christian Stuebner, Paul | ||||
| Tarjan, Franklin Tse, and Nick Walker. | ||||
| Appendix C. Acknowledgements | Appendix C. Acknowledgements | |||
| [[ Add OAuth 1.0a authors + WG contributors ]] | [[ Add OAuth 1.0a authors + WG contributors ]] | |||
| Appendix D. Document History | Appendix D. Document History | |||
| [[ to be removed by RFC editor before publication as an RFC ]] | [[ to be removed by RFC editor before publication as an RFC ]] | |||
| -11 | ||||
| o Many editorial changes. Fixed user authorization section | ||||
| structure. Removed unused normative references. Adjusted | ||||
| language regarding single use of authorization codes. | ||||
| o Fixed header ABNF. | ||||
| o Change access token description from shared symmetric secret to | ||||
| password. | ||||
| o Moved access grant 'none' to a separate section, renamed to | ||||
| 'client_credentials'. | ||||
| o Demoted the HTTP status code requirement from MUST to SHOULD in | ||||
| protected resource response error. | ||||
| o Removed 'expired_token' error code. | ||||
| o Moved all the 'code_and_token' parameter to the fragment (from | ||||
| code being in the query). | ||||
| o Removed 'assertion_type' parameter (moved to 'grant_type'). | ||||
| o Added note about redirecting to invalid redirection URIs (open | ||||
| redirectors). | ||||
| o Removed bearer token section, added new required 'token_type' | ||||
| parameter with extensibility. | ||||
| o 'error-uri' parameter value changed to absolute URI. | ||||
| o OAuth 2.0 HTTP authentication scheme name changed to 'OAuth2'. | ||||
| o Dropped the 'WWW-Authenticate' header field 'realm' parameter. | ||||
| o Removed definition of access token characters. | ||||
| o Added instructions for dealing with error and an invalid | ||||
| redirection URI. | ||||
| -10 | -10 | |||
| o Fixed typos. Many editorial changes. Rewrote introduction. | o Fixed typos. Many editorial changes. Rewrote introduction. | |||
| removed terminology grouping. | removed terminology grouping. | |||
| o Allowed POST for end-user authorization endpoint. | o Allowed POST for end-user authorization endpoint. | |||
| o Fixed token endpoint to not require client authentication. | o Fixed token endpoint to not require client authentication. | |||
| o Made URI query and POST body 'oauth_token' parameter optional. | o Made URI query and POST body 'oauth_token' parameter optional. | |||
| skipping to change at page 38, line 41 ¶ | skipping to change at page 41, line 13 ¶ | |||
| supported for extensions). | supported for extensions). | |||
| o Defined permitted access token string characters (suitable for | o Defined permitted access token string characters (suitable for | |||
| inclusion in an HTTP header). | inclusion in an HTTP header). | |||
| o Added a note about conflicts with previous versions. | o Added a note about conflicts with previous versions. | |||
| o Moved 'client_id' definition from client authentication to access | o Moved 'client_id' definition from client authentication to access | |||
| token endpoint. | token endpoint. | |||
| o Added definition for 'access grant'. | ||||
| -09 | -09 | |||
| o Fixed typos, editorial changes. | o Fixed typos, editorial changes. | |||
| o Added token expiration example. | o Added token expiration example. | |||
| o Added scope parameter to end-user authorization endpoint response. | o Added scope parameter to end-user authorization endpoint response. | |||
| o Added note about parameters with empty values (same as omitted). | o Added note about parameters with empty values (same as omitted). | |||
| skipping to change at page 42, line 4 ¶ | skipping to change at page 44, line 26 ¶ | |||
| -01 | -01 | |||
| o Editorial changes based on feedback from Brian Eaton, Bill Keenan, | o Editorial changes based on feedback from Brian Eaton, Bill Keenan, | |||
| and Chuck Mortimore. | and Chuck Mortimore. | |||
| o Changed device flow "type" parameter values and switch to use only | o Changed device flow "type" parameter values and switch to use only | |||
| the token endpoint. | the token endpoint. | |||
| -00 | -00 | |||
| o Initial draft based on a combination of WRAP and OAuth 1.0a. | o Initial draft based on a combination of WRAP and OAuth 1.0a. | |||
| 9. References | 10. References | |||
| 9.1. Normative References | 10.1. Normative References | |||
| [I-D.ietf-httpbis-p1-messaging] | [I-D.ietf-httpbis-p1-messaging] | |||
| Fielding, R., Gettys, J., Mogul, J., Nielsen, H., | Fielding, R., Gettys, J., Mogul, J., Nielsen, H., | |||
| Masinter, L., Leach, P., Berners-Lee, T., and J. Reschke, | Masinter, L., Leach, P., Berners-Lee, T., and J. Reschke, | |||
| "HTTP/1.1, part 1: URIs, Connections, and Message | "HTTP/1.1, part 1: URIs, Connections, and Message | |||
| Parsing", draft-ietf-httpbis-p1-messaging-09 (work in | Parsing", draft-ietf-httpbis-p1-messaging-09 (work in | |||
| progress), March 2010. | progress), March 2010. | |||
| [NIST FIPS-180-3] | ||||
| National Institute of Standards and Technology, "Secure | ||||
| Hash Standard (SHS). FIPS PUB 180-3, October 2008". | ||||
| [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | |||
| Extensions (MIME) Part One: Format of Internet Message | Extensions (MIME) Part One: Format of Internet Message | |||
| Bodies", RFC 2045, November 1996. | Bodies", RFC 2045, November 1996. | |||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | ||||
| Hashing for Message Authentication", RFC 2104, | ||||
| February 1997. | ||||
| [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, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
| Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
| Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | |||
| [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., | [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., | |||
| Leach, P., Luotonen, A., and L. Stewart, "HTTP | Leach, P., Luotonen, A., and L. Stewart, "HTTP | |||
| Authentication: Basic and Digest Access Authentication", | Authentication: Basic and Digest Access Authentication", | |||
| RFC 2617, June 1999. | RFC 2617, June 1999. | |||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | |||
| [RFC2828] Shirey, R., "Internet Security Glossary", RFC 2828, | ||||
| May 2000. | ||||
| [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media | [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media | |||
| Types", RFC 3023, January 2001. | Types", RFC 3023, January 2001. | |||
| [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography | [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography | |||
| Standards (PKCS) #1: RSA Cryptography Specifications | Standards (PKCS) #1: RSA Cryptography Specifications | |||
| Version 2.1", RFC 3447, February 2003. | Version 2.1", RFC 3447, February 2003. | |||
| [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, November 2003. | 10646", STD 63, RFC 3629, November 2003. | |||
| skipping to change at page 43, line 29 ¶ | skipping to change at page 45, line 46 ¶ | |||
| [RFC5849] Hammer-Lahav, E., "The OAuth 1.0 Protocol", RFC 5849, | [RFC5849] Hammer-Lahav, E., "The OAuth 1.0 Protocol", RFC 5849, | |||
| April 2010. | April 2010. | |||
| [W3C.REC-html401-19991224] | [W3C.REC-html401-19991224] | |||
| Raggett, D., Hors, A., and I. Jacobs, "HTML 4.01 | Raggett, D., Hors, A., and I. Jacobs, "HTML 4.01 | |||
| Specification", World Wide Web Consortium | Specification", World Wide Web Consortium | |||
| Recommendation REC-html401-19991224, December 1999, | Recommendation REC-html401-19991224, December 1999, | |||
| <http://www.w3.org/TR/1999/REC-html401-19991224>. | <http://www.w3.org/TR/1999/REC-html401-19991224>. | |||
| 9.2. Informative References | 10.2. Informative References | |||
| [I-D.hammer-oauth] | ||||
| Hammer-Lahav, E., "The OAuth 1.0 Protocol", | ||||
| draft-hammer-oauth-10 (work in progress), February 2010. | ||||
| [I-D.hardt-oauth] | ||||
| Hardt, D., Tom, A., Eaton, B., and Y. Goland, "OAuth Web | ||||
| Resource Authorization Profiles", draft-hardt-oauth-01 | ||||
| (work in progress), January 2010. | ||||
| [OASIS.saml-core-2.0-os] | [OASIS.saml-core-2.0-os] | |||
| Cantor, S., Kemp, J., Philpott, R., and E. Maler, | Cantor, S., Kemp, J., Philpott, R., and E. Maler, | |||
| "Assertions and Protocol for the OASIS Security Assertion | "Assertions and Protocol for the OASIS Security Assertion | |||
| Markup Language (SAML) V2.0", OASIS Standard saml-core- | Markup Language (SAML) V2.0", OASIS Standard saml-core- | |||
| 2.0-os, March 2005. | 2.0-os, March 2005. | |||
| Authors' Addresses | Authors' Addresses | |||
| Eran Hammer-Lahav (editor) | Eran Hammer-Lahav (editor) | |||
| End of changes. 155 change blocks. | ||||
| 600 lines changed or deleted | 711 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/ | ||||