| < draft-ietf-oauth-v2-08.txt | draft-ietf-oauth-v2-09.txt > | |||
|---|---|---|---|---|
| Network Working Group E. Hammer-Lahav, Ed. | Network Working Group E. Hammer-Lahav, Ed. | |||
| Internet-Draft Yahoo! | Internet-Draft Yahoo! | |||
| Intended status: Standards Track D. Recordon | Intended status: Standards Track D. Recordon | |||
| Expires: December 17, 2010 Facebook | Expires: December 31, 2010 Facebook | |||
| D. Hardt | D. Hardt | |||
| Microsoft | Microsoft | |||
| June 15, 2010 | June 29, 2010 | |||
| The OAuth 2.0 Protocol | The OAuth 2.0 Protocol | |||
| draft-ietf-oauth-v2-08 | draft-ietf-oauth-v2-09 | |||
| Abstract | Abstract | |||
| This specification describes the OAuth 2.0 protocol. | This specification describes the OAuth 2.0 protocol. | |||
| 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 December 17, 2010. | This Internet-Draft will expire on December 31, 2010. | |||
| 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 3 | 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1.3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 1.4. Client Profiles . . . . . . . . . . . . . . . . . . . . . 8 | 1.4. Client Profiles . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.4.1. Web Server . . . . . . . . . . . . . . . . . . . . . . 8 | 1.4.1. Web Server . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 1.4.2. User-Agent . . . . . . . . . . . . . . . . . . . . . . 9 | 1.4.2. User-Agent . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 1.4.3. Native Application . . . . . . . . . . . . . . . . . . 11 | 1.4.3. Native Application . . . . . . . . . . . . . . . . . . 13 | |||
| 1.4.4. Autonomous . . . . . . . . . . . . . . . . . . . . . . 12 | 1.4.4. Autonomous . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 2. Client Credentials . . . . . . . . . . . . . . . . . . . . . . 12 | 2. Client Credentials . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 2.1. Basic Client Credentials . . . . . . . . . . . . . . . . . 13 | 2.1. Basic Client Credentials . . . . . . . . . . . . . . . . . 15 | |||
| 3. Obtaining End-User Authorization . . . . . . . . . . . . . . . 14 | 3. Obtaining End-User Authorization . . . . . . . . . . . . . . . 16 | |||
| 3.1. Authorization Server Response . . . . . . . . . . . . . . 16 | 3.1. Authorization Response . . . . . . . . . . . . . . . . . . 18 | |||
| 4. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 17 | 3.2. Error Response . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.1. Access Grant Parameters . . . . . . . . . . . . . . . . . 18 | 3.2.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 4.1.1. Authorization Code . . . . . . . . . . . . . . . . . . 18 | 4. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 21 | |||
| 4.1.2. Resource Owner Basic Credentials . . . . . . . . . . . 19 | 4.1. Access Grant Types . . . . . . . . . . . . . . . . . . . . 22 | |||
| 4.1.3. Assertion . . . . . . . . . . . . . . . . . . . . . . 20 | 4.1.1. Authorization Code . . . . . . . . . . . . . . . . . . 23 | |||
| 4.1.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 20 | 4.1.2. Resource Owner Basic Credentials . . . . . . . . . . . 23 | |||
| 4.2. Access Token Response . . . . . . . . . . . . . . . . . . 21 | 4.1.3. Assertion . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 4.3. Error Response . . . . . . . . . . . . . . . . . . . . . . 22 | 4.1.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 25 | |||
| 4.3.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 23 | 4.2. Access Token Response . . . . . . . . . . . . . . . . . . 25 | |||
| 5. Accessing a Protected Resource . . . . . . . . . . . . . . . . 23 | 4.3. Error Response . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.1. The Authorization Request Header Field . . . . . . . . . . 24 | 4.3.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.2. URI Query Parameter . . . . . . . . . . . . . . . . . . . 25 | 5. Accessing a Protected Resource . . . . . . . . . . . . . . . . 28 | |||
| 5.3. Form-Encoded Body Parameter . . . . . . . . . . . . . . . 25 | 5.1. Authenticated Requests . . . . . . . . . . . . . . . . . . 29 | |||
| 6. The WWW-Authenticate Response Header Field . . . . . . . . . . 26 | 5.1.1. The Authorization Request Header Field . . . . . . . . 29 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 27 | 5.1.2. URI Query Parameter . . . . . . . . . . . . . . . . . 29 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | 5.1.3. Form-Encoded Body Parameter . . . . . . . . . . . . . 30 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 27 | 5.2. The WWW-Authenticate Response Header Field . . . . . . . . 31 | |||
| Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 27 | 5.2.1. Error Codes . . . . . . . . . . . . . . . . . . . . . 32 | |||
| Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . . 28 | 6. Extensibility . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| Appendix D. Document History . . . . . . . . . . . . . . . . . . 28 | 6.1. Defining New Client Credentials Types . . . . . . . . . . 33 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | 6.2. Defining New Endpoint Parameters . . . . . . . . . . . . . 33 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . . 31 | 6.3. Defining New Header Field Parameters . . . . . . . . . . . 34 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . . 32 | 6.4. Defining New Access Grant Types . . . . . . . . . . . . . 34 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 32 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 34 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | ||||
| 8.1. The OAuth Parameters Registry . . . . . . . . . . . . . . 34 | ||||
| 8.1.1. Registration Template . . . . . . . . . . . . . . . . 35 | ||||
| 8.1.2. Example . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 36 | ||||
| Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 36 | ||||
| Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . . 36 | ||||
| Appendix D. Document History . . . . . . . . . . . . . . . . . . 36 | ||||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . . 40 | ||||
| 9.2. Informative References . . . . . . . . . . . . . . . . . . 41 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 42 | ||||
| 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). In the traditional client-server | username and password). | |||
| authentication model, a client accessing a protected resource on a | ||||
| server presents the resource owner's credentials in order to | ||||
| authenticate and gain access. | ||||
| OAuth introduces a third role to the traditional client-server | In the traditional client-server authentication model, the client | |||
| authentication model: the resource owner. In OAuth, the client | accesses a protected resource on the server by presenting the | |||
| (which is usually not the resource owner, but is acting on its | resource owner's credentials in order to authenticate and gain | |||
| behalf) requests access to resources controlled by the resource owner | access. OAuth introduces a third role to the traditional model: the | |||
| and hosted by the resource server. | resource owner. In OAuth, the client (which is usually not the | |||
| resource owner, but is acting on its behalf) requests access to | ||||
| resources controlled by the resource owner and hosted by the resource | ||||
| server. | ||||
| In addition to removing the need for resource owners to share their | In addition to removing the need for resource owners to share their | |||
| credentials, resource owners should also have the ability to restrict | credentials, resource owners require the ability to restrict access | |||
| access to a limited subset of the resources they control, to limit | to a limited subset of the resources they control, to limit access | |||
| access duration, or to limit access to the methods supported by these | duration, or to limit access to the methods supported by these | |||
| resources. | resources. | |||
| 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 (which denotes a specific | resources, clients obtain an access token (a string which denotes a | |||
| scope, duration, and other attributes). Tokens are issued to third- | specific scope, duration, and other attributes). The format and | |||
| party client by an authorization server with the approval of the | structure of access tokens is beyond the scope of this specification. | |||
| resource owner. The client uses the access token to access the | ||||
| protected resources. | Tokens are issued to third-party clients by an authorization server | |||
| with the approval of the resource owner. The client uses the access | ||||
| token to access the protected resources hosted by the resource | ||||
| server. The interaction between the authorization server and | ||||
| 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 | |||
| the photo sharing service (authorization server) which issues the | the photo sharing service (authorization server) which issues the | |||
| printing service delegation-specific credentials (token). | printing service delegation-specific credentials (token). | |||
| This specification defines the use of OAuth over HTTP [RFC2616] (or | This specification defines the use of OAuth over HTTP [RFC2616] (or | |||
| HTTP over TLS as defined by [RFC2818]). Other specifications may | HTTP over TLS as defined by [RFC2818]). Other specifications may | |||
| extend it for use with other transport protocols. | extend it for use with other transport protocols. | |||
| 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 realm and auth- | are included from [RFC2617]: realm, auth-param; from [RFC3986]: URI- | |||
| param rules are included from [RFC2617]. | Reference; and from [I-D.ietf-httpbis-p1-messaging]: OWS, RWS, and | |||
| 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 4, line 47 ¶ | skipping to change at page 6, line 11 ¶ | |||
| and other authorization attributes granted by the resource | and other authorization attributes granted by the resource | |||
| owner and enforced by the resource server and authorization | owner and enforced by the resource server and authorization | |||
| servers. | servers. | |||
| access token | access token | |||
| A token used by the client to make authenticated requests | A token used by the client to make authenticated requests | |||
| on behalf of the resource owner. | on behalf of the resource owner. | |||
| refresh token | refresh token | |||
| A token used by the client to obtain a new access token | A token used by the client to obtain a new access token | |||
| (in addition or as a replacement for an expired access | without having to involve the resource owner. | |||
| token), without having to involve the resource owner. | ||||
| authorization code A short-lived token representing the access | authorization code A short-lived token representing the access | |||
| grant provided by the end-user. The authorization code | grant provided by the end-user. The authorization code | |||
| is used to obtain an access token and a refresh token. | is used to obtain an access token and a refresh token. | |||
| 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. | |||
| skipping to change at page 5, line 36 ¶ | skipping to change at page 6, line 44 ¶ | |||
| An unique identifier issued to the client to identify itself to | An 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 2. | |||
| 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 from the resource owner, | |||
| then exchange that access grant for an access token (representing the | then exchange the access grant for an access token (representing the | |||
| grant's scope, duration, and other attributes). The client accesses | grant's scope, duration, and other attributes). The client accesses | |||
| the protected resource by presenting the access token to the resource | the protected resource by presenting the access token to the resource | |||
| server. | server. | |||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| | |--(A)-- Authorization Request --->| Resource | | | |--(A)-- Authorization Request --->| Resource | | |||
| | | | Owner | | | | | Owner | | |||
| | |<-(B)------ Access Grant ---------| | | | |<-(B)------ Access Grant ---------| | | |||
| | | +---------------+ | | | +---------------+ | |||
| | | | | | | |||
| skipping to change at page 6, line 30 ¶ | skipping to change at page 7, line 30 ¶ | |||
| | |<-(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 includes the following | |||
| steps: | steps: | |||
| (A) The client requests authorization from the resource owner. The | (A) The client requests authorization from the resource owner. The | |||
| client should not interact directly with the resource owner | client should not interact directly with the resource owner | |||
| (since that would exposing the resource owner's credentials to | (since that would expose the resource owner's credentials to the | |||
| the client), but instead requests authorization via an | client), but instead request authorization via an authorization | |||
| authorization server or other entities. For example, the client | server or other entities. For example, the client directs the | |||
| directs the resource owner to the authorization server which in | resource owner to the authorization server which in turn issues | |||
| turn issues it an access grant. When cannot be avoided, the | it an access grant. When unavoidable, the client interacts | |||
| client interacts directly with the end-user, asking for the end- | directly with the end-user, asking for the end-user's username | |||
| user's username and password. | 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 | (B) The client is issued an access grant which represents the | |||
| authorization provided by the resource owner. The access grant | authorization provided by the resource owner. The access grant | |||
| can be expressed as: | can be expressed as: | |||
| * Authorization code - an access grant obtained via an | * Authorization code - an access grant obtained via an | |||
| authorization server. The process used to obtain an | authorization server. The process used to obtain an | |||
| authorization code is described in Section 3. | authorization code utilized the end-user's user-agent and is | |||
| described in Section 3. | ||||
| * Assertion - an access grant obtained from entities using a | * Assertion - an access grant obtained using a different trust | |||
| different trust framework. Assertions enable the client to | framework. Assertions enable the client to utilize existing | |||
| utilize existing trust relationships to obtain an access | trust relationships to obtain an access token. They provide | |||
| token. They provide a bridge between OAuth and other trust | a bridge between OAuth and other trust frameworks. The | |||
| frameworks. The access grant represented by an assertion | access grant represented by an assertion depends on the | |||
| depends on the assertion type, its content, and how it was | assertion type, its content, and how it was issued, which are | |||
| issued, which are beyond the scope of this specification. | beyond the scope of this specification. | |||
| * Basic end-user credentials - obtained when interacting | * Resource owner basic credentials - obtained when interacting | |||
| directly with an end-user. Resource owner credentials should | directly with a resource-owner. Resource owner basic | |||
| only be used when there is a high degree of trust between the | credentials (i.e. a username and password) should only be | |||
| resource owner the client (e.g. its computer operating system | used when there is a high degree of trust between the | |||
| or a highly privileged application). However, unlike the | resource owner and the client (e.g. its computer operating | |||
| HTTP Basic authentication scheme defined in [RFC2617], the | system or a highly privileged application). However, unlike | |||
| end-user's credentials are used in a single request and are | the HTTP Basic authentication scheme defined in [RFC2617], | |||
| exchanged for an access token and refresh token which | the resource owner's credentials are used for a single | |||
| eliminates the client need to store them for future use. | 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, and presenting the access grant. The | |||
| token request is described in Section 4. | token request is described in Section 4. | |||
| (D) The authorization server validated 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 issues an access token with an optional | |||
| refresh token. Access token usually have a shorter lifetime | refresh token. Access tokens usually have a shorter lifetime | |||
| than the access grant. Refresh tokens usually have a lifetime | than the access grant. Refresh tokens usually have a lifetime | |||
| equal to the duration of the access grant. When an access token | equal to the duration of the access grant. When an access token | |||
| expires, the refresh token is used to obtain a new access token | expires, the refresh token is used to obtain a new access token | |||
| without having to request another access grant from the resource | without having to request another access grant from the resource | |||
| owner (in which case, the refresh token acts as an access | owner. | |||
| grant). | ||||
| (E) The client makes a protect 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, and presents the access token in order to gain access. | |||
| Accessing a protected resource is described in Section 5. | 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 behalf of itself (the client is also the | When the client is acting on its own behalf (the client is also the | |||
| resource owner), the client skips steps (A) and (B), and does not | resource owner), the client does not obtain an access grant. The | |||
| include an access grant in step (C). When the client uses the user- | simplified protocol flow is illustrated in Figure 2: | |||
| agent profile (described in Section 1.4.2), the authorization request | ||||
| (A) results in an access token (D), skipping steps (B) and (C). | ||||
| The sizes of tokens and other values received from the authorization | +--------+ +---------------+ | |||
| server, are left undefined by this specification. Clients should | | |--(C)--- Client Credentials ----->| Authorization | | |||
| avoid making assumptions about value sizes. Servers should document | | | | Server | | |||
| the expected size of any value they issue. | | |<-(D)------ Access Token ---------| | | |||
| | | (w/ Optional Refresh Token) +---------------+ | ||||
| | Client | | ||||
| | | +---------------+ | ||||
| | |--(E)------ Access Token -------->| Resource | | ||||
| | | | Server | | ||||
| | |<-(F)---- Protected Resource -----| | | ||||
| +--------+ +---------------+ | ||||
| Figure 2: Protocol Flow for Client Acting On Its Own Behalf | ||||
| When the client uses the user-agent profile (described in | ||||
| Section 1.4.2), the authorization request results in an access token, | ||||
| as illustrated in Figure 3: | ||||
| +--------+ +----------+ +---------------+ | ||||
| | |--(A)-- Authorization --+- -+-->| | | ||||
| | | Request | Resource | | Authorization | | ||||
| | | | Owner | | Server | | ||||
| | |<-(D)-- Access Token ---+- -+---| | | ||||
| | | +----------+ +---------------+ | ||||
| | Client | | ||||
| | | +---------------+ | ||||
| | |--(E)-------- Access Token ----------->| Resource | | ||||
| | | | Server | | ||||
| | |<-(F)------ Protected Resource --------| | | ||||
| +--------+ +---------------+ | ||||
| Figure 3: Indirect Access Grant Protocol Flow | ||||
| 1.4. Client Profiles | 1.4. Client Profiles | |||
| OAuth supports a wide range of client types by providing a rich and | OAuth supports a wide range of client types by providing a rich and | |||
| extensible framework for establishing authorization and exchaning it | extensible framework for establishing authorization and exchanging it | |||
| for an access token. The methods detailed in this specification were | for an access token. The methods detailed in this specification were | |||
| designed to accomodate four client types: web servers, user-agents, | designed to accommodate four client types: web servers, user-agents, | |||
| native applications, and autonomous clients. Additional | native applications, and autonomous clients. Additional | |||
| authorization flows and client profiles may be defined by other | authorization flows and client profiles may be defined by other | |||
| specifications to cover additional scenarios and client types. | specifications to cover additional scenarios and client types. | |||
| 1.4.1. Web Server | 1.4.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 from the authorization server (capable | |||
| of acting as an HTTP server). | of acting as an HTTP server). | |||
| skipping to change at page 8, line 41 ¶ | skipping to change at page 10, line 31 ¶ | |||
| | | | | | | | | | | |||
| ^ v | | | ^ v | | | |||
| +---------+ | | | +---------+ | | | |||
| | |>---(D)-- Client Credentials, --------' | | | |>---(D)-- Client Credentials, --------' | | |||
| | Web | Authorization Code, | | | Web | Authorization Code, | | |||
| | Client | & Redirect URI | | | Client | & Redirect URI | | |||
| | | | | | | | | |||
| | |<---(E)----- Access Token -------------------' | | |<---(E)----- Access Token -------------------' | |||
| +---------+ (w/ Optional Refresh Token) | +---------+ (w/ Optional Refresh Token) | |||
| Figure 2: Web Server Flow | Figure 4: Web Server Flow | |||
| The web server flow illustrated in Figure 2 includes the following | The web server flow illustrated in Figure 4 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 using client type "web_server". The client | in Section 3 The client includes its client identifier, | |||
| includes its client identifier, requested scope, local state, | requested scope, local state, and a redirect URI to which the | |||
| and a redirect URI to which the authorization server will send | authorization server will send the end-user back once access is | |||
| 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. | |||
| skipping to change at page 10, line 12 ¶ | skipping to change at page 12, line 12 ¶ | |||
| to the end-user and other applications residing on the computer or | to the end-user and other applications residing on the computer or | |||
| device. | device. | |||
| +----------+ Client Identifier +----------------+ | +----------+ Client Identifier +----------------+ | |||
| | |>---(A)-- & Redirection URI --->| | | | |>---(A)-- & Redirection URI --->| | | |||
| | | | | | | | | | | |||
| End <--+ - - - +----(B)-- User authenticates -->| Authorization | | End <--+ - - - +----(B)-- User authenticates -->| Authorization | | |||
| User | | | Server | | User | | | Server | | |||
| | |<---(C)--- Redirect URI -------<| | | | |<---(C)--- Redirect URI -------<| | | |||
| | Client | with Access Token | | | | Client | with Access Token | | | |||
| | in | (w/ Optional Authorization +----------------+ | | in | in Fragment +----------------+ | |||
| | Browser | Code) in Fragment | | 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 3: User-Agent Flow | Figure 5: User-Agent Flow | |||
| The user-agent flow illustrated in Figure 3 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 using client type | endpoint as described in Section 3. The client includes its | |||
| "user-agent". The client includes its client identifier, | client identifier, requested scope, local state, and a redirect | |||
| requested scope, local state, and a redirect URI to which the | URI to which the authorization server will send the end-user | |||
| authorization server will send the end-user back once | back once authorization is granted (or denied). | |||
| 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 | |||
| earlier. The redirection URI includes the access token (and an | earlier. The redirection URI includes the access token in the | |||
| optional authorization code) in the URI fragment. | URI fragment. | |||
| (D) The user-agent follows the redirection instructions by making a | (D) The user-agent follows the redirection instructions by making a | |||
| request to the web server which does not include the fragment. | request to the web server which does not include the fragment. | |||
| The user-agent retains the fragment information locally. | The user-agent retains the fragment information locally. | |||
| (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 | |||
| which extracts the access token and passes it to the client. If | locally, which extracts the access token and passes it to the | |||
| an authorization code was issued, the client can pass it to a | client. | |||
| web server component to obtain another access token for | ||||
| additional server-based protected resources interaction. | ||||
| 1.4.3. Native Application | 1.4.3. Native Application | |||
| Native application are clients running as native code on the end- | Native application 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 incapable of | with (or embedding) the end-user's user-agent but are limited in how | |||
| receiving callback requests from the server (incapable of acting as | such interaction affects their end-user experience. In many cases, | |||
| an HTTP server). | native applications are incapable of receiving direct callback | |||
| requests from the server (e.g. firewall, operating system | ||||
| 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 3 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 puts the | a server-hosted resource under the client's control which makes | |||
| response in the user-agent window title (from which the client can | the response available to the client (e.g. using the window title | |||
| obtain the response by polling the user-agnet window, looking for | or other locations accessible from outside the user-agent). | |||
| a window title change). | ||||
| 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 3 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 basic credentials (username and | o Prompt end-users for their basic credentials (username and | |||
| password) and use them directly to obtain an access token. This | password) and use them directly to obtain an access token. This | |||
| is generally discouraged as it hands the end-user's password | is generally discouraged as it hands the end-user's password | |||
| directly to the 3rd party and is limited to basic credentials. | directly to the 3rd party and is limited to basic credentials. | |||
| 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: | |||
| 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 are less secure because users are | o Embedded user-agents pose a security challenge because users are | |||
| authenticating in unidentified window without access to the | authenticating in an unidentified window without access to the | |||
| protections offered by many user-agents. | visual protections offered by many user-agents. | |||
| 1.4.4. Autonomous | 1.4.4. Autonomous | |||
| Autonomous clients act on their own behalf (the client is also the | Autonomous clients utilize an existing trust relationship or | |||
| resource owner), or utilize existing trust relationship or framework | framework to establish authorization. Autonomous clients can be | |||
| to establish authorization without directly involving the resource | implemented in different ways based on their requirements and the | |||
| owner. | existing trust framework they rely upon. Autonomous clients can: | |||
| Autonomous clients can be implemented in different ways based on | ||||
| their requirements and the 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. | the client, or that of another resource owner previously arranged | |||
| 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 a 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. | |||
| skipping to change at page 13, line 5 ¶ | skipping to change at page 14, line 47 ¶ | |||
| the scope of this specification, but usually involve registration | the scope of this specification, but usually involve registration | |||
| with the authorization server. [[ OAuth Discovery provides one way of | with the authorization server. [[ OAuth Discovery provides one way of | |||
| obtaining basic client credentials ]] | obtaining basic client credentials ]] | |||
| 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 credentials | make assumptions about the confidentiality of client credentials | |||
| without establishing trust with the client operator. Authorization | without establishing trust with the client operator. Authorization | |||
| servers SHOULD NOT issue client secrets to clients incapable of | servers SHOULD NOT issue client secrets to clients incapable of | |||
| keeping their secrets confidential. | keeping their secrets confidential. | |||
| This specification provides one mean of authenticating the client | This specification provides one mechanism for authenticating the | |||
| using a set of basic client credentials. The authorization server | client using a set of basic client credentials. The authorization | |||
| MAY authenticate the client using any desired authentication scheme. | server MAY authenticate the client using any desired authentication | |||
| scheme. | ||||
| The client MUST NOT include more than one set of client credentials | ||||
| with each request, and MUST NOT utilize more than one mechanism to | ||||
| authenticate each request (regardless whether the credentials are | ||||
| identical). | ||||
| 2.1. Basic Client Credentials | 2.1. Basic Client Credentials | |||
| The basic client credentials include a client identifier and an | The basic client credentials include a client identifier and an | |||
| OPTIONAL matching shared symmetric secret. The client identifier and | OPTIONAL matching shared symmetric secret. The client identifier and | |||
| secret are included in the request using the HTTP Basic | secret are included in the request using the HTTP Basic | |||
| authentication scheme as defined in [RFC2617] by including the client | authentication scheme as defined in [RFC2617] by including the client | |||
| identifier as the username and secret as the password. | identifier as the username and secret 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 | |||
| type=web_server&code=i1WsRn1uB1& | type=web-server&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 credentials using the | Alternatively, the client MAY include the credentials using the | |||
| following request parameters: | following request parameters: | |||
| client_id | client_id | |||
| REQUIRED. The client identifier. | REQUIRED. The client identifier. | |||
| client_secret REQUIRED if the client identifier has a matching | client_secret REQUIRED if the client identifier has a matching | |||
| secret. | secret. | |||
| 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 | |||
| type=web_server&client_id=s6BhdRkqt3& | type=web-server&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 client MAY include the client credentials using other HTTP | ||||
| authentication schemes which support authenticating using a username | ||||
| and password. The client MUST NOT include the client credentials | ||||
| using more than one mechanism. If more than one mechanism is used, | ||||
| regardless whether the credentials are identical or valid, the server | ||||
| MUST reply with an HTTP 400 status code (Bad Request) and include the | ||||
| "multiple_credentials" error code. | ||||
| The authorization server MUST accept the client credentials using | The authorization server MUST accept the client credentials using | |||
| both the request parameters, and the HTTP Basic authentication | both the request parameters, and the HTTP Basic authentication | |||
| scheme. The authorization server MAY support additional | scheme. The authorization server MAY support additional | |||
| authentication schemes. | authentication schemes suitable for the transmission of a username | |||
| and password. | ||||
| 3. Obtaining End-User Authorization | 3. Obtaining End-User Authorization | |||
| When the client interacts with an end-user, the end-user MUST first | When the client interacts with an end-user, the end-user MUST first | |||
| grant the client authorization to access its protected resources. | grant the client authorization to access its protected resources. | |||
| Once obtained, the end-user access grant is expressed as an | Once obtained, the end-user access grant is expressed as an | |||
| authorization code which the client uses to obtain an access token. | authorization code which the client uses to obtain an access token. | |||
| To obtain an end-user authorization, the client sends the end-user to | To obtain an end-user authorization, the client sends the end-user to | |||
| the end-user authorization endpoint. | the end-user authorization endpoint. | |||
| skipping to change at page 14, line 41 ¶ | skipping to change at page 16, line 35 ¶ | |||
| 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, or can be obtained by using [[ OAuth | |||
| Discovery ]]. The end-user authorization endpoint URI MAY include a | Discovery ]]. The end-user authorization endpoint URI MAY include a | |||
| query component as defined by [RFC3986] section 3, which must be | query component as defined by [RFC3986] section 3, 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 | |||
| 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. | |||
| 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]: | |||
| type | response_type | |||
| REQUIRED. The client type (user-agent or web server). | REQUIRED. The requested response: an access token, an | |||
| Determines how the authorization server delivers the | authorization code, or both. The parameter value MUST be set | |||
| authorization response back to the client. The parameter value | to "token" for requesting an access token, "code" for | |||
| MUST be set to "web_server" or "user_agent". | requesting an authorization code, or "code-and-token" to | |||
| request both. The authorization server MAY decline to provide | ||||
| one or more of these response types. [[ The 'code-and-token' | ||||
| 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 2. | |||
| 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. Authorization servers | to pre-register their redirection URI. | |||
| MAY restrict the redirection URI to not include a query | ||||
| component as defined by [RFC3986] section 3. | ||||
| state | ||||
| OPTIONAL. An opaque value used by the client to maintain state | ||||
| between the request and callback. The authorization server | ||||
| includes this value when redirecting the user-agent back to the | ||||
| client. | ||||
| 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. | requested scope. | |||
| state | ||||
| OPTIONAL. An opaque value used by the client to maintain state | ||||
| between the request and callback. The authorization server | ||||
| includes this value when redirecting the user-agent back to the | ||||
| client. | ||||
| The client directs the end-user to the constructed URI using an HTTP | The client directs the end-user to the constructed URI using an HTTP | |||
| redirection response, or by other means available to it via the end- | redirection response, or by other means available to it via the end- | |||
| user's user-agent. The request MUST use the HTTP "GET" method. | user's user-agent. The request MUST use the HTTP "GET" method. | |||
| For example, the client directs the end-user's user-agent to make the | For example, the client directs the end-user's user-agent to make the | |||
| following HTTPS request (line breaks are for display purposes only): | following HTTP request using transport-layer security (line breaks | |||
| are for display purposes only): | ||||
| GET /authorize?type=web_server&client_id=s6BhdRkqt3&redirect_uri= | GET /authorize?response_type=code&client_id=s6BhdRkqt3& | |||
| 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. [[ provide guidance on how to perform matching | |||
| ]] | ]] | |||
| Parameters sent without a value MUST be treated as if they were | ||||
| omitted from the request. | ||||
| The authorization server validates the request to ensure all required | ||||
| parameters are present and valid. If the request is invalid, the | ||||
| authorization server immediately redirects the user-agent back to the | ||||
| client using the redirection URI provided with the appropriate error | ||||
| code as described in Section 3.2. | ||||
| 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 Server Response | 3.1. 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: | redirection URI (as described below): | |||
| code | code | |||
| REQUIRED if the client type is "web_server", otherwise | REQUIRED if the response type is "token" or "code-and-token", | |||
| OPTIONAL. The authorization code generated by the | otherwise MUST NOT be included. The authorization code | |||
| authorization server. The authorization code SHOULD expire | generated by the authorization server. The authorization code | |||
| shortly after it is issued and allowed for a single use. The | SHOULD expire shortly after it is issued. The authorization | |||
| authorization code is bound to the client identifier and | server MUST invalidate the authorization code after a single | |||
| redirection URI. | usage. The authorization code is bound to the client | |||
| identifier and redirection URI. | ||||
| access_token | access_token | |||
| REQUIRED if the client type is "user_agent", otherwise MUST NOT | REQUIRED if the response type is "token" or "code-and-token", | |||
| be included. The access token. | otherwise MUST NOT be included. The access token. | |||
| 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. | if an access token is included. For example, the value "3600" | |||
| denotes that the access token will expire in one hour from the | ||||
| state | time the response was generated by the authorization server. | |||
| REQUIRED if the "state" parameter was present in the client | ||||
| authorization request. Set to the exact value received from | ||||
| the client. | ||||
| If the end-user denies the access request, the authorization server | ||||
| informs the client by adding the following parameters to the | ||||
| redirection URI: | ||||
| error | scope | |||
| REQUIRED. The parameter value MUST be set to "user_denied". | OPTIONAL. The scope of the access token as a list of space- | |||
| delimited strings if an access token is included. The value of | ||||
| the "scope" parameter is defined by the authorization server. | ||||
| If the value contains multiple space-delimited strings, their | ||||
| order does not matter, and each string adds an additional | ||||
| access range to the requested scope. | ||||
| 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. | |||
| The method in which the authorization server adds the parameter to | The method in which the authorization server adds the parameter to | |||
| the redirection URI is determined by the client type provided by the | the redirection URI is determined by the response type requested by | |||
| client in the authorization request using the "type" parameter. | the client in the authorization request using the "response_type" | |||
| parameter. | ||||
| If the client type is "web_server", the authorization server adds the | If the response type is "code", the authorization server adds the | |||
| 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 client type is "user_agent", the authorization server adds the | If the response type is "token", the authorization server adds the | |||
| parameters to the redirection URI fragment component using the | parameters to the redirection URI fragment 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]. [[ replace form-encoded with JSON? ]] | [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: http://example.com/rd#access_token=FJQbwq9&expires_in=3600 | 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- | ||||
| agent by sending the following HTTP response (line breaks are for | ||||
| display purposes only): | ||||
| HTTP/1.1 302 Found | ||||
| Location: http://example.com/rd?code=i1WsRn1uB1 | ||||
| #access_token=FJQbwq9&expires_in=3600 | ||||
| The sizes of tokens and other values received from the authorization | ||||
| server, are left undefined by this specification. Clients should | ||||
| avoid making assumptions about value sizes. Servers should document | ||||
| the expected size of any value they issue. | ||||
| 3.2. Error Response | ||||
| If the end-user denies the access request or if the request is | ||||
| invalid, 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 | ||||
| [W3C.REC-html401-19991224]: | ||||
| error | ||||
| REQUIRED. A single error code as described in Section 3.2.1. | ||||
| error_description OPTIONAL. A human-readable text providing | ||||
| additional information, used to assist in the understanding and | ||||
| resolution of the error occurred. | ||||
| error_uri OPTIONAL. A URI identifying a human-readable web page | ||||
| with information about the error, used to provide the end-user | ||||
| with additional information about the error. | ||||
| state | ||||
| REQUIRED if the "state" parameter was present in the client | ||||
| authorization request. Set to the exact value received from | ||||
| the client. | ||||
| For example, the authorization server redirects the end-user's user- | ||||
| agent by sending the following HTTP response: | ||||
| HTTP/1.1 302 Found | ||||
| Location: https://client.example.com/cb?error=access-denied | ||||
| 3.2.1. Error Codes | ||||
| The authorization server includes one of the following error codes | ||||
| with the error response: | ||||
| invalid-request | ||||
| The request is missing a required parameter, includes an | ||||
| unknown parameter or parameter value, or is otherwise | ||||
| malformed. | ||||
| invalid-client-id | ||||
| The client identifier provided is invalid. | ||||
| unauthorized-client | ||||
| The client is not authorized to use the requested response | ||||
| type. | ||||
| redirect-uri-mismatch | ||||
| The redirection URI provided does not match a pre-registered | ||||
| value. | ||||
| access-denied | ||||
| The end-user or authorization server denied the request. | ||||
| unsupported-response-type | ||||
| The requested response type is not supported by the | ||||
| authorization server. | ||||
| invalid_scope | ||||
| The requested scope is invalid, unknown, or malformed. | ||||
| [[ Add mechanism for extending error codes ]] | ||||
| 4. Obtaining an Access Token | 4. 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. | authorization server and presenting its access grant. | |||
| After obtaining authorization from the resource owner, clients | After establishing resource owner authorization, clients request an | |||
| request an access token from the authorization server's token | access token from the authorization server's token endpoint. When | |||
| endpoint. When requesting an access token, the client authenticates | requesting an access token, the client authenticates with the | |||
| with the authorization server and includes the access grant (in the | authorization server and includes the access grant (in the form of an | |||
| form of an authorization code, resource owner credentials, an | authorization code, resource owner credentials, an assertion, or a | |||
| assertion, or a refresh token). | refresh token). | |||
| The location of the token endpoint can be found in the service | The location of the token endpoint can be found in the service | |||
| documentation, or can be obtained by using [[ OAuth Discovery ]]. | documentation, or can be obtained by using [[ OAuth Discovery ]]. | |||
| The token endpoint URI MAY include a query component, which must be | ||||
| retained when adding additional query parameters. | The token endpoint URI MAY include a query component. | |||
| 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 | plain 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 | |||
| mechanism when sending requests to the token endpoints. Servers MUST | security mechanism when sending requests to the token endpoints. | |||
| support TLS 1.2 as defined in [RFC5246] and MAY support addition | Servers MUST support TLS 1.2 as defined in [RFC5246], and MAY support | |||
| mechanisms with equivalent protections. | additional transport-layer security mechanisms. | |||
| The client requests an access token by constructing a token request | The client requests an access token by constructing a token request | |||
| and making an HTTP "POST" request. The client constructs the request | and making an HTTP "POST" request. The client constructs the request | |||
| URI by adding its client credentials to the request as described in | URI by adding its client credentials to the request as described in | |||
| Section 2, and includes the following parameters using the | Section 2, and includes the following parameters using the | |||
| "application/x-www-form-urlencoded" format in the HTTP request | "application/x-www-form-urlencoded" format in the HTTP request | |||
| entity-body: | entity-body: | |||
| grant_type | grant_type | |||
| REQUIRED. The access grand type included in the request. | REQUIRED. The access grant type included in the request. | |||
| Value MUST be one of "authorization_code", | Value MUST be one of "authorization-code", "basic-credentials", | |||
| "user_basic_credentials", "assertion", "refresh_token", or | "assertion", "refresh-token", or "none". | |||
| "none" (which indicates the client is acting on behalf of | ||||
| itself). | ||||
| 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. | |||
| 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 4.1. | |||
| 4.1. Access Grant Parameters | Parameters sent without a value MUST be treated as if they were | |||
| omitted from the request. | ||||
| 4.1. Access Grant Types | ||||
| The client requests an access token using one of the four types of | ||||
| access grants: authorization code, basic credentials, assertion, or | ||||
| refresh token. | ||||
| When requesting an access token using the "none" access grant type | ||||
| (no access grant is included), the client is requesting access to 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.1. Authorization Code | 4.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 HTTPS request (line | For example, the client makes the following HTTP request using | |||
| breaks are for display purposes only): | transport-layer security (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 verify that the authorization code, | The authorization server MUST verify that the authorization code, | |||
| client identity, client secret, and redirection URI are all valid and | client identity, client secret, and redirection URI are all valid and | |||
| match its stored association. If the request is valid, the | match its stored association. If the request is valid, the | |||
| authorization server issues a successful response as described in | authorization server issues a successful response as described in | |||
| Section 4.2. | Section 4.2. | |||
| 4.1.2. Resource Owner Basic Credentials | 4.1.2. Resource Owner Basic Credentials | |||
| The client includes the resource owner credentials using the | The client includes the resource owner credentials using the | |||
| following parameters: [[ add internationalization consideration for | "basic-credentials" access grant type and the following parameters: | |||
| username and password ]] | [[ add internationalization consideration for username and password | |||
| ]] | ||||
| username | username | |||
| REQUIRED. The end-user's username. | REQUIRED. The end-user's username. | |||
| password | password | |||
| REQUIRED. The end-user's password. | REQUIRED. The end-user's password. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTP request using | |||
| breaks are for display purposes only): | transport-layer security (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=user_basic&client_id=s6BhdRkqt3& | grant_type=basic-credentials&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 and | The authorization server MUST validate the client credentials and | |||
| end-user credentials and if valid issues an access token response as | end-user credentials and if valid issues an access token response as | |||
| described in Section 4.2. | described in Section 4.2. | |||
| 4.1.3. Assertion | 4.1.3. Assertion | |||
| The client includes the assertion using the following parameters: | The client includes the assertion using the "assertion" access grant | |||
| type and the following parameters: | ||||
| assertion_type | assertion_type | |||
| REQUIRED. The format of the assertion as defined by the | REQUIRED. The format of the assertion as defined by the | |||
| authorization server. The value MUST be an absolute URI. | authorization server. The value MUST be an absolute URI. | |||
| assertion | assertion | |||
| REQUIRED. The assertion. | REQUIRED. The assertion. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTP request using | |||
| breaks are for display purposes only): | transport-layer security (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=assertion&client_id=s6BhdRkqt3&client_secret=diejdsks& | grant_type=assertion&client_id=s6BhdRkqt3&client_secret=diejdsks& | |||
| assertion_type=urn%3Aoasis%3Anames%sAtc%3ASAML%3A2.0%3Aassertion& | assertion_type=urn%3Aoasis%3Anames%3Atc%3ASAML%3A2.0%3Aassertion& | |||
| assertion=PHNhbWxwOl...[ommited for brevity]...ZT4%3D | assertion=PHNhbWxwOl...[omitted for brevity]...ZT4%3D | |||
| The authorization server MUST validate the assertion and if valid | The authorization server MUST validate the assertion and if valid | |||
| issues an access token response as described in Section 4.2. The | issues an access token response as described in Section 4.2. The | |||
| authorization server SHOULD NOT issue a refresh token. | authorization server SHOULD NOT issue a refresh token. | |||
| Authorization servers SHOULD issue access tokens with a limited | Authorization servers SHOULD issue access tokens with a limited | |||
| lifetime and require clients to refresh them by requesting a new | lifetime and require clients to refresh them by requesting a new | |||
| access token using the same assertion if it is still valid. | access token using the same assertion if it is still valid. | |||
| Otherwise the client MUST obtain a new valid assertion. | Otherwise the client MUST obtain a new valid assertion. | |||
| 4.1.4. Refresh Token | 4.1.4. Refresh Token | |||
| The client includes the refresh token using the following parameters: | The client includes the refresh token using the "refresh-token" | |||
| 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 HTTPS request (line break | For example, the client makes the following HTTP request using | |||
| are for display purposes only): | transport-layer security (line break 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=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, the | The authorization server MUST verify the client credentials, the | |||
| validity of the refresh token, and that the resource owner's | validity of the refresh token, and that the resource owner's | |||
| authorization is still valid. If the request is valid, the | 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 4.2. The authorization server MAY issue a new refresh token. | |||
| in which case the client MUST NOT use the previous refresh token and | ||||
| replace it with the newly issued refresh token. | ||||
| 4.2. Access Token Response | 4.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 status code (OK): | 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. | |||
| expires_in | expires_in | |||
| OPTIONAL. The duration in seconds of the access token | OPTIONAL. The duration in seconds of the access token | |||
| lifetime. | lifetime. For example, the value "3600" denotes that the | |||
| access token will expire in one hour from the time the response | ||||
| 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. | Section 4.1.4. | |||
| 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 | |||
| skipping to change at page 22, line 29 ¶ | skipping to change at page 26, line 47 ¶ | |||
| 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", | |||
| "expires_in":3600, | "expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8" | "refresh_token":"8xLOxBtZp8" | |||
| } | } | |||
| The sizes of tokens and other values received from the authorization | ||||
| server, are left undefined by this specification. Clients should | ||||
| avoid making assumptions about value sizes. Servers should document | ||||
| the expected size of any value they issue. | ||||
| 4.3. Error Response | 4.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 with a a 400 status code (Bad | the entity body of the HTTP response using the "application/json" | |||
| Request) using the "application/json" media type: | media type: | |||
| error | error | |||
| REQUIRED. The error code as described in Section 4.3.1. | REQUIRED. A single error code as described in Section 4.3.1. | |||
| error_description OPTIONAL. A human-readable text providing | ||||
| additional information, used to assist in the understanding and | ||||
| resolution of the error occurred. | ||||
| error_uri OPTIONAL. A URI identifying a human-readable web page | ||||
| with information about the error, used to provide the end-user | ||||
| with additional information about the error. | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Cache-Control: no-store | Cache-Control: no-store | |||
| { | { | |||
| "error":"incorrect_client_credentials" | "error":"invalid-request" | |||
| } | } | |||
| 4.3.1. Error Codes | If the client provided invalid credentials using an HTTP | |||
| authentication scheme via the "Authorization" request header field, | ||||
| [[ expalain each error code: ]] | the authorization server MUST respond with the HTTP 401 | |||
| (Unauthorized) status code. Otherwise, the authorization server | ||||
| SHALL respond with the HTTP 400 (Bad Request) status code. | ||||
| o "redirect_uri_mismatch" | 4.3.1. Error Codes | |||
| o "bad_authorization_code" | The authorization server includes one of the following error codes | |||
| with the error response: | ||||
| o "invalid_client_credentials" | invalid-request | |||
| The request is missing a required parameter, includes an | ||||
| unknown parameter or parameter value, repeats a parameter, | ||||
| includes multiple credentials, utilizes more than one mechanism | ||||
| for authenticating the client, or is otherwise malformed. | ||||
| o "unauthorized_client'" - The client is not permitted to use this | invalid-client-credentials | |||
| access grant type. | The client identifier provided is invalid, the client failed to | |||
| authenticate, or the client provided multiple client | ||||
| credentials. | ||||
| o "invalid_assertion" | unauthorized-client | |||
| The client is not authorized to use the access grant type | ||||
| provided. | ||||
| o "unknown_format" | invalid-grant | |||
| The provided access grant is invalid, expired, or revoked (e.g. | ||||
| invalid assertion, expired authorization token, bad end-user | ||||
| basic credentials, or mismatching authorization code and | ||||
| redirection URI). | ||||
| o "authorization_expired" | unsupported-grant-type | |||
| The access grant included - its type or another attribute - is | ||||
| not supported by the authorization server. | ||||
| o "multiple_credentials" | invalid-scope | |||
| The requested scope is invalid, unknown, malformed, or exceeds | ||||
| the previously granted scope. | ||||
| o "invalid_user_credentials" | [[ Add mechanism for extending error codes ]] | |||
| 5. Accessing a Protected Resource | 5. 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. | the resource server. Access tokens act as bearer tokens, where the | |||
| token string acts as a shared symmetric secret. This requires | ||||
| For example: | treating the access token with the same care as other secrets (e.g. | |||
| end-user passwords). Access tokens SHOULD NOT be sent in the clear | ||||
| GET /resource HTTP/1.1 | over an insecure channel. | |||
| Host: server.example.com | ||||
| Authorization: Token token="vF9dft4qmT" | ||||
| Access tokens act as bearer tokens, where the token string acts as a | ||||
| shared symmetric secret. This requires treating the access token | ||||
| with the same care as other secrets (e.g. end-user passwords). | ||||
| Access tokens SHOULD NOT be sent in the clear over an insecure | ||||
| channel. | ||||
| However, when it is necessary to transmit bearer tokens in the clear | However, when it is necessary to transmit access tokens in the clear | |||
| without a secure channel, authorization servers SHOULD issue access | without a secure channel, authorization servers SHOULD issue access | |||
| tokens with limited scope and lifetime to reduce the potential risk | tokens with limited scope and lifetime to reduce the potential risk | |||
| from a compromised access token. | from a compromised access token. | |||
| Clients SHOULD NOT make authenticated requests with an access token | Clients MUST NOT make authenticated requests with an access token to | |||
| to unfamiliar resource servers, especially when using bearer tokens, | unfamiliar resource servers, regardless of the presence of a secure | |||
| regardless of the presence of a secure channel. | channel. | |||
| The methods used by the resource server to validate the access token | The resource server MUST validate the access token and ensure it has | |||
| are beyond the scope of this specification, but generally involve an | 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 | interaction or coordination between the resource server and | |||
| authorization server. | authorization server. | |||
| The resource server MUST validate the access token and ensure it has | 5.1. Authenticated Requests | |||
| not expired and that its scope covers the requested resource. If the | ||||
| token expired or is invalid, the resource server MUST reply with an | ||||
| HTTP 401 status code (Unauthorized) and include the HTTP | ||||
| "WWW-Authenticate" response header field as described in Section 6. | ||||
| For example: | ||||
| HTTP/1.1 401 Unauthorized | ||||
| WWW-Authenticate: Token realm='Service', error='token_expired' | ||||
| Clients make authenticated token requests using the "Authorization" | Clients make authenticated token requests using the "Authorization" | |||
| request header field as described in Section 5.1. Alternatively, | request header field as described in Section 5.1.1. Alternatively, | |||
| clients MAY include the access token using the HTTP request URI in | clients MAY include the access token using the HTTP request URI in | |||
| the query component as described in Section 5.2, or in the HTTP body | the query component as described in Section 5.1.2, or in the HTTP | |||
| when using the "application/x-www-form-urlencoded" content type as | body when using the "application/x-www-form-urlencoded" content type | |||
| described in Section 5.3. | as described in Section 5.1.3. | |||
| Clients SHOULD only use the request URI or body when the | Clients SHOULD only use the request URI or body when the | |||
| "Authorization" request header field is not available, and MUST NOT | "Authorization" request header field is not available, and MUST NOT | |||
| use more than one method in each request. [[ specify error ]] | use more than one method in each request. | |||
| 5.1. The Authorization Request Header Field | 5.1.1. The Authorization Request Header Field | |||
| The "Authorization" request header field is used by clients to make | The "Authorization" request header field is used by clients to make | |||
| authenticated token requests. The client uses the "token" attribute | authenticated token requests. The client uses the "token" attribute | |||
| to include the access token in the request. | to include the access token in the request. | |||
| For example: | ||||
| GET /resource HTTP/1.1 | ||||
| Host: server.example.com | ||||
| Authorization: Token token="vF9dft4qmT" | ||||
| The "Authorization" header field uses the framework defined by | The "Authorization" header field uses the framework defined by | |||
| [RFC2617] as follows: | [RFC2617] as follows: | |||
| credentials = "Token" RWS access-token [ CS 1#auth-param ] | credentials = "Token" RWS access-token [ CS 1#auth-param ] | |||
| access-token = "token" "=" <"> token <"> | access-token = "token" "=" <"> token <"> | |||
| CS = OWS "," OWS | CS = OWS "," OWS | |||
| 5.2. URI Query Parameter | 5.1.2. URI Query Parameter | |||
| When including the access token in the HTTP request URI, the client | When including the access token in the HTTP request URI, the client | |||
| adds the access token to the request URI query component as defined | adds the access token to the request URI query component as defined | |||
| by [RFC3986] using the "oauth_token" parameter. | by [RFC3986] using the "oauth_token" parameter. | |||
| For example, the client makes the following HTTPS request: | For example, the client makes the following HTTP request using | |||
| transport-layer security: | ||||
| GET /resource?oauth_token=vF9dft4qmT HTTP/1.1 | GET /resource?oauth_token=vF9dft4qmT HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| The HTTP request URI query can include other request-specific | The HTTP request URI query can include other request-specific | |||
| parameters, in which case, the "oauth_token" parameters SHOULD be | parameters, in which case, the "oauth_token" parameters SHOULD be | |||
| appended following the request-specific parameters, properly | appended following the request-specific parameters, properly | |||
| separated by an "&" character (ASCII code 38). | separated by an "&" character (ASCII code 38). | |||
| The resource server MUST validate the access token and ensure it has | For example: | |||
| not expired and its scope includes the requested resource. If the | ||||
| resource expired or is not valid, the resource server MUST reply with | ||||
| an HTTP 401 status code (Unauthorized) and include the HTTP | ||||
| "WWW-Authenticate" response header field as described in Section 6. | ||||
| 5.3. Form-Encoded Body Parameter | http://example.com/resource?x=y&oauth_token=vF9dft4qmT | |||
| 5.1.3. Form-Encoded Body Parameter | ||||
| When including the access token in the HTTP request entity-body, the | When including the access token in the HTTP request entity-body, the | |||
| client adds the access token to the request body using the | client adds the access token to the request body using the | |||
| "oauth_token" parameter. The client can use this method only if the | "oauth_token" parameter. The client can use this method only if the | |||
| following REQUIRED conditions are met: | following REQUIRED conditions are met: | |||
| o The entity-body is single-part. | o The entity-body is single-part. | |||
| o The entity-body follows the encoding requirements of the | o The entity-body follows the encoding requirements of the | |||
| "application/x-www-form-urlencoded" content-type as defined by | "application/x-www-form-urlencoded" content-type as defined by | |||
| skipping to change at page 26, line 5 ¶ | skipping to change at page 31, line 5 ¶ | |||
| o The HTTP request entity-header includes the "Content-Type" header | o The HTTP request entity-header includes the "Content-Type" header | |||
| field set to "application/x-www-form-urlencoded". | field set to "application/x-www-form-urlencoded". | |||
| o The HTTP request method is "POST", "PUT", or "DELETE". | o The HTTP request method is "POST", "PUT", or "DELETE". | |||
| The entity-body can include other request-specific parameters, in | The entity-body can include other request-specific parameters, in | |||
| which case, the "oauth_token" parameters SHOULD be appended following | which case, the "oauth_token" parameters SHOULD be appended following | |||
| the request-specific parameters, properly separated by an "&" | the request-specific parameters, properly separated by an "&" | |||
| character (ASCII code 38). | character (ASCII code 38). | |||
| For example, the client makes the following HTTPS request: | For example, the client makes the following HTTP request using | |||
| transport-layer security: | ||||
| POST /resource HTTP/1.1 | POST /resource 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 | |||
| oauth_token=vF9dft4qmT | oauth_token=vF9dft4qmT | |||
| The resource server MUST validate the access token and ensure it has | 5.2. The WWW-Authenticate Response Header Field | |||
| not expired and its scope includes the requested resource. If the | ||||
| resource expired or is not valid, the resource server MUST reply with | ||||
| an HTTP 401 status code (Unauthorized) and include the HTTP | ||||
| "WWW-Authenticate" response header field as described in Section 6. | ||||
| 6. The WWW-Authenticate Response Header Field | ||||
| Clients access protected resources after locating the appropriate | ||||
| end-user authorization endpoint and token endpoint and obtaining an | ||||
| access token. In many cases, interacting with a protected resource | ||||
| requires prior knowledge of the protected resource properties and | ||||
| methods, as well as its authentication requirements (i.e. | ||||
| establishing client identity, locating the end-user authorization and | ||||
| token endpoints). | ||||
| However, there are cases in which clients are unfamiliar with the | ||||
| protected resource, including whether the resource requires | ||||
| authentication. When clients attempt to access an unfamiliar | ||||
| protected resource without an access token, the resource server | ||||
| denies the request and informs the client of the required credentials | ||||
| using an HTTP authentication challenge. | ||||
| In addition, when receiving an invalid authenticated request, the | ||||
| resource server issues an authentication challenge including the | ||||
| error type and message. | ||||
| A resource server receiving a request for a protected resource | ||||
| without a valid access token MUST respond with a 401 (Unauthorized) | ||||
| or 403 (Forbidden) HTTP status code, and include at least one "Token" | ||||
| "WWW-Authenticate" response header field challenge. | ||||
| The "WWW-Authenticate" header field uses the framework defined by | If the protected resource request contains an invalid access token or | |||
| [RFC2617] as follows: | is malformed, the resource server MUST include the HTTP | |||
| "WWW-Authenticate" response header field. The "WWW-Authenticate" | ||||
| header field uses the framework defined by [RFC2617] as follows: | ||||
| challenge = "Token" RWS token-challenge | challenge = "Token" RWS token-challenge | |||
| token-challenge = realm | token-challenge = realm | |||
| [ CS error ] | [ CS error ] | |||
| [ CS error-desc ] | ||||
| [ CS error-uri ] | ||||
| [ CS scope ] | ||||
| [ CS 1#auth-param ] | [ CS 1#auth-param ] | |||
| error = "error" "=" <"> token <"> | error = "error" "=" <"> token <"> | |||
| error-desc = "error-description" "=" quoted-string | ||||
| error-uri = "error-uri" = <"> URI-Reference <"> | ||||
| scope = ptoken / <"> ptoken *( 1*SP ptoken ) <"> | ||||
| ptoken = 1*ptokenchar | ||||
| ptokenchar = "!" / "#" / "$" / "%" / "&" / "'" / "(" | ||||
| / ")" / "*" / "+" / "-" / "." / "/" / DIGIT | ||||
| / ":" / "<" / "=" / ">" / "?" / "@" / ALPHA | ||||
| / "[" / "]" / "^" / "_" / "`" / "{" / "|" | ||||
| / "}" / "~" | ||||
| For example: | ||||
| HTTP/1.1 401 Unauthorized | ||||
| WWW-Authenticate: Token realm='Example Service', error='expired-token' | ||||
| The "realm" attribute is used to provide the protected resources | The "realm" attribute is used to provide the protected resources | |||
| partition as defined by [RFC2617]. | partition as defined by [RFC2617]. [[ add explanation ]] | |||
| The "error" attribute is used to inform the client the reason why an | The "error" attribute is used to provide the client with the reason | |||
| access request was declined. [[ Add list of error codes ]] | why the access request was declined. The parameter values are | |||
| described in Section 5.2.1. | ||||
| The "error-description" attribute provides a human-readable text | ||||
| containing additional information, used to assist in the | ||||
| understanding and resolution of the error occurred. | ||||
| The "error-uri" attribute provides a URI identifying a human-readable | ||||
| web page with information about the error, used to offer the end-user | ||||
| 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 | ||||
| indicating the required scope of the access token for accessing the | ||||
| requested resource. | ||||
| 5.2.1. Error Codes | ||||
| The authorization server includes one of the following error codes | ||||
| with the error response: | ||||
| invalid-request | ||||
| The request is missing a required parameter, includes an | ||||
| unknown parameter or parameter value, repeats the same | ||||
| parameter, uses more than one method for including an access | ||||
| token, or is otherwise malformed. The resource server MUST | ||||
| respond with the HTTP 400 (Bad Request) status code. | ||||
| invalid-token | ||||
| The access token provided is invalid. Resource servers SHOULD | ||||
| use this error code when receiving an expired token which | ||||
| cannot be refreshed to indicate to the client that a new | ||||
| authorization is necessary. The resource server MUST respond | ||||
| with the HTTP 401 (Unauthorized) status code. | ||||
| 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 | ||||
| The request requires higher privileges than provided by the | ||||
| access token. The resource server SHOULD respond with the HTTP | ||||
| 403 (Forbidden) status code and MAY include the "scope" | ||||
| attribute with the scope necessary to access the protected | ||||
| resource. | ||||
| [[ Add mechanism for extending error codes ]] | ||||
| If the request lacks any authentication information (i.e. the client | ||||
| was unaware authentication is necessary), the resource server SHOULD | ||||
| not include an error code or other error information. | ||||
| For example: | ||||
| HTTP/1.1 401 Unauthorized | ||||
| WWW-Authenticate: Token realm='Example Service' | ||||
| 6. Extensibility | ||||
| 6.1. Defining New Client Credentials Types | ||||
| [[ TBD ]] | ||||
| 6.2. Defining New Endpoint Parameters | ||||
| Applications that wish to define new request or response parameters | ||||
| for use with the end-user authorization endpoint or the token | ||||
| endpoint SHALL do so in one of two ways: register them in the | ||||
| parameters registry (following the procedures in Section 8.1), or use | ||||
| the "x_" parameter name prefix. | ||||
| Parameters utilizing the "x_" parameter name prefix MUST be limited | ||||
| to vendor-specific extensions that are not commonly applicable, and | ||||
| are specific to the implementation details of the authorization | ||||
| server where they are used. All other new parameters MUST be | ||||
| registered, and MUST NOT use the "x_" parameter name prefix. | ||||
| Parameter names MUST conform to the param-name ABNF, and parameter | ||||
| values syntax MUST be well-defined (e.g., using ABNF, or a reference | ||||
| to the syntax of an existing parameter). | ||||
| param-name = 1*fchar | ||||
| fchar = "-" / "." / "_" / DIGIT / ALPHA | ||||
| 6.3. Defining New Header Field Parameters | ||||
| Applications that wish to define new parameters for use in the OAuth | ||||
| "Authorization" or "WWW-Authenticate" header fields MUST register | ||||
| them in the parameters registry, following the procedures in | ||||
| Section 8.1. | ||||
| Parameter names MUST conform to the param-name ABNF and MUST NOT | ||||
| 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 | ||||
| reference to the syntax of an existing parameter). | ||||
| param-value = ptoken | quoted-string | ||||
| 6.4. Defining New Access Grant Types | ||||
| The assertion access grant type was designed to allow the | ||||
| authorization server to accept additional access grants not | ||||
| specified. Applications that wish to define additional access grant | ||||
| types can do so by utilizing a new or existing assertion type and | ||||
| format. | ||||
| 7. Security Considerations | 7. Security Considerations | |||
| [[ todo ]] | [[ TBD ]] | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| [[ Not Yet ]] | 8.1. The OAuth Parameters Registry | |||
| This document establishes the OAuth parameters registry. | ||||
| Additional parameters to be use in the end-user authorization | ||||
| endpoint request, the end-user authorization endpoint response, the | ||||
| token endpoint request, the token endpoint response, the | ||||
| "Authorization" header field, or the "WWW-Authenticate" header field, | ||||
| are registered on the advice of one or more Designated Experts | ||||
| (appointed by the IESG or their delegate), with a Specification | ||||
| Required (using terminology from [RFC5226]). However, to allow for | ||||
| the allocation of values prior to publication, the Designated | ||||
| Expert(s) may approve registration once they are satisfied that such | ||||
| a specification will be published. | ||||
| Registration requests should be sent to the [TBD]@ietf.org mailing | ||||
| list for review and comment, with an appropriate subject (e.g., | ||||
| "Request for parameter: example"). [[ Note to RFC-EDITOR: The name of | ||||
| the mailing list should be determined in consultation with the IESG | ||||
| and IANA. Suggested name: oauth-ext-review. ]] | ||||
| Before a period of 14 days has passed, the Designated Expert(s) will | ||||
| either approve or deny the registration request, communicating this | ||||
| decision both to the review list and to IANA. Denials should include | ||||
| an explanation and, if applicable, suggestions as to how to make the | ||||
| request successful. Registration requests that are undetermined for | ||||
| a period longer than 21 days can be brought to the IESG's attention | ||||
| (using the iesg@iesg.org mailing list) for resolution. | ||||
| 8.1.1. Registration Template | ||||
| Parameter name: The name requested (e.g., "example"). | ||||
| Parameter usage location: The location(s) where parameter can be | ||||
| used. The possible locations are: the end-user authorization | ||||
| endpoint request, the end-user authorization endpoint response, | ||||
| the token endpoint request, the token endpoint response, the | ||||
| "Authorization" header field, or the "WWW-Authenticate" header | ||||
| field. | ||||
| Change controller: For standards-track RFCs, state "IETF". For | ||||
| others, give the name of the responsible party. Other details | ||||
| (e.g., postal address, e-mail address, home page URI) may also be | ||||
| included. | ||||
| Specification document(s): Reference to document that specifies the | ||||
| parameter, preferably including a URI that can be used to retrieve | ||||
| a copy of the document. An indication of the relevant sections | ||||
| may also be included, but is not required. | ||||
| Related information: Optionally, citations to additional documents | ||||
| containing further relevant information. | ||||
| 8.1.2. Example | ||||
| The following is the parameter registration request for the "scope" | ||||
| parameter as defined in this specification: | ||||
| Parameter name: scope | ||||
| Parameter usage location: The end-user authorization endpoint | ||||
| request, the end-user authorization endpoint response, the token | ||||
| endpoint request, the token endpoint response, and the | ||||
| "WWW-Authenticate" header field. | ||||
| Change controller: IETF | ||||
| Specification document(s): [[ this document ]] | ||||
| Related information: None | ||||
| Appendix A. Examples | Appendix A. Examples | |||
| [[ todo ]] | [[ TBD ]] | |||
| Appendix B. Contributors | Appendix B. Contributors | |||
| The following people contributed to preliminary versions of this | The following people contributed to preliminary versions of this | |||
| document: Blaine Cook (BT), Brian Eaton (Google), Yaron Goland | document: Blaine Cook (BT), Brian Eaton (Google), Yaron Goland | |||
| (Microsoft), Brent Goldman (Facebook), Raffi Krikorian (Twitter), | (Microsoft), Brent Goldman (Facebook), Raffi Krikorian (Twitter), | |||
| 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, Igor Faynberg, George Fletcher, Evan Gilbert, Justin Hart, | Culver, Brian Ellin, Igor Faynberg, George Fletcher, Evan Gilbert, | |||
| John Kemp, Torsten Lodderstedt, Eve Maler, James Manger, Chuck | Justin Hart, John Kemp, Chasen Le Hara, Torsten Lodderstedt, Eve | |||
| Mortimore, Justin Richer, Peter Saint-Andre, Nat Sakimura, Rob Sayre, | Maler, James Manger, Laurence Miao, Chuck Mortimore, Justin Richer, | |||
| Marius Scurtescu, Justin Smith, and Franklin Tse. | Peter Saint-Andre, Nat Sakimura, Rob Sayre, Marius Scurtescu, Justin | |||
| Smith, Jeremy Suriel, and Franklin Tse. | ||||
| 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 ]] | |||
| -09 | ||||
| o Fixed typos, editorial changes. | ||||
| o Added token expiration example. | ||||
| o Added scope parameter to end-user authorization endpoint response. | ||||
| o Added note about parameters with empty values (same as omitted). | ||||
| o Changed parameter values to use '-' instead of '_'. Parameter | ||||
| names still use '_'. | ||||
| o Changed authorization endpoint client type to response type with | ||||
| values: code, token, and both. | ||||
| o Complete cleanup of error codes. Added support for error | ||||
| description and URI. | ||||
| o Add initial extensibility support. | ||||
| -08 | -08 | |||
| o Renamed verification code to authorization code. | o Renamed verification code to authorization code. | |||
| o Revised terminology, structured section, added new terms. | o Revised terminology, structured section, added new terms. | |||
| o Changed flows to profiles and moved to introduction. | o Changed flows to profiles and moved to introduction. | |||
| o Added support for access token rescoping. | o Added support for access token rescoping. | |||
| skipping to change at page 32, line 15 ¶ | skipping to change at page 41, line 22 ¶ | |||
| [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. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, January 2005. | RFC 3986, January 2005. | |||
| [RFC4627] Crockford, D., "The application/json Media Type for | [RFC4627] Crockford, D., "The application/json Media Type for | |||
| JavaScript Object Notation (JSON)", RFC 4627, July 2006. | JavaScript Object Notation (JSON)", RFC 4627, July 2006. | |||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | ||||
| May 2008. | ||||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| (TLS) Protocol Version 1.2", RFC 5246, August 2008. | (TLS) Protocol Version 1.2", RFC 5246, August 2008. | |||
| [W3C.REC-html401-19991224] | [W3C.REC-html401-19991224] | |||
| Hors, A., Raggett, D., and I. Jacobs, "HTML 4.01 | Hors, A., Jacobs, I., and D. Raggett, "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 | 9.2. Informative References | |||
| [I-D.hammer-oauth] | [I-D.hammer-oauth] | |||
| Hammer-Lahav, E., "The OAuth 1.0 Protocol", | Hammer-Lahav, E., "The OAuth 1.0 Protocol", | |||
| draft-hammer-oauth-10 (work in progress), February 2010. | draft-hammer-oauth-10 (work in progress), February 2010. | |||
| End of changes. 124 change blocks. | ||||
| 348 lines changed or deleted | 712 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/ | ||||