| < draft-ietf-oauth-v2-01.txt | draft-ietf-oauth-v2-02.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: October 31, 2010 Facebook | Expires: November 7, 2010 Facebook | |||
| D. Hardt | D. Hardt | |||
| April 29, 2010 | May 6, 2010 | |||
| The OAuth 2.0 Protocol | The OAuth 2.0 Protocol | |||
| draft-ietf-oauth-v2-01 | draft-ietf-oauth-v2-02 | |||
| Abstract | Abstract | |||
| This specification describes the OAuth 2.0 protocol. OAuth provides | This specification describes the OAuth 2.0 protocol. OAuth provides | |||
| a method for making authenticated HTTP requests using a token - an | a method for making authenticated HTTP requests using a token - an | |||
| identifier used to denote an access grant with specific scope, | identifier used to denote an access grant with specific scope, | |||
| duration, and other attributes. Tokens are issued to third-party | duration, and other attributes. Tokens are issued to third-party | |||
| clients by an authorization server with the approval of the resource | clients by an authorization server with the approval of the resource | |||
| owner. OAuth defines multiple flows for obtaining a token to support | owner. OAuth defines multiple flows for obtaining a token to support | |||
| a wide range of client types and user experience. | a wide range of client types and user experience. | |||
| skipping to change at page 1, line 38 ¶ | skipping to change at page 1, line 38 ¶ | |||
| 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 October 31, 2010. | This Internet-Draft will expire on November 7, 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 | |||
| skipping to change at page 3, line 17 ¶ | skipping to change at page 2, line 21 ¶ | |||
| 1. Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 2.2. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2.2. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.3. Example . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 2.3. Example . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 2.4. Notational Conventions . . . . . . . . . . . . . . . . . . 8 | 2.4. Notational Conventions . . . . . . . . . . . . . . . . . . 8 | |||
| 2.5. Conformance . . . . . . . . . . . . . . . . . . . . . . . 8 | 2.5. Conformance . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 3. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 8 | 3. Obtaining an Access Token . . . . . . . . . . . . . . . . . . 8 | |||
| 3.1. Authorization Endpoint . . . . . . . . . . . . . . . . . . 9 | 3.1. Authorization Endpoint . . . . . . . . . . . . . . . . . . 9 | |||
| 3.2. Token Endpoint . . . . . . . . . . . . . . . . . . . . . . 9 | 3.2. Token Endpoint . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.3. Flow Parameters . . . . . . . . . . . . . . . . . . . . . 10 | 3.2.1. Response Format . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.4. Client Credentials . . . . . . . . . . . . . . . . . . . . 10 | 3.3. Flow Parameters . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.5. User Delegation Flows . . . . . . . . . . . . . . . . . . 11 | 3.4. Client Credentials . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.5.1. User-Agent Flow . . . . . . . . . . . . . . . . . . . 11 | 3.5. User Delegation Flows . . . . . . . . . . . . . . . . . . 12 | |||
| 3.5.2. Web Server Flow . . . . . . . . . . . . . . . . . . . 16 | 3.5.1. User-Agent Flow . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.5.3. Device Flow . . . . . . . . . . . . . . . . . . . . . 22 | 3.5.2. Web Server Flow . . . . . . . . . . . . . . . . . . . 17 | |||
| 3.6. End-user Credentials Flows . . . . . . . . . . . . . . . . 27 | 3.5.3. Device Flow . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 3.6.1. Username and Password Flow . . . . . . . . . . . . . . 27 | 4. End-user Credentials Flows . . . . . . . . . . . . . . . . . . 28 | |||
| 3.7. Autonomous Client Flows . . . . . . . . . . . . . . . . . 30 | 4.1. Username and Password Flow . . . . . . . . . . . . . . . . 29 | |||
| 3.7.1. Client Credentials Flow . . . . . . . . . . . . . . . 30 | 4.1.1. Client Requests Access Token . . . . . . . . . . . . . 30 | |||
| 3.7.2. Assertion Flow . . . . . . . . . . . . . . . . . . . . 33 | 5. Autonomous Client Flows . . . . . . . . . . . . . . . . . . . 32 | |||
| 4. Refreshing an Access Token . . . . . . . . . . . . . . . . . . 35 | 5.1. Client Credentials Flow . . . . . . . . . . . . . . . . . 32 | |||
| 5. Accessing a Protected Resource . . . . . . . . . . . . . . . . 38 | 5.1.1. Client Requests Access Token . . . . . . . . . . . . . 32 | |||
| 5.1. The Authorization Request Header . . . . . . . . . . . . . 38 | 5.2. Assertion Flow . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 5.2. Bearer Token Requests . . . . . . . . . . . . . . . . . . 40 | 5.2.1. Client Requests Access Token . . . . . . . . . . . . . 35 | |||
| 5.2.1. URI Query Parameter . . . . . . . . . . . . . . . . . 40 | 6. Refreshing an Access Token . . . . . . . . . . . . . . . . . . 36 | |||
| 5.2.2. Form-Encoded Body Parameter . . . . . . . . . . . . . 41 | 7. Accessing a Protected Resource . . . . . . . . . . . . . . . . 38 | |||
| 5.3. Cryptographic Tokens Requests . . . . . . . . . . . . . . 42 | 7.1. The Authorization Request Header . . . . . . . . . . . . . 39 | |||
| 5.3.1. The 'hmac-sha256' Algorithm . . . . . . . . . . . . . 42 | 7.2. Bearer Token Requests . . . . . . . . . . . . . . . . . . 40 | |||
| 6. Identifying a Protected Resource . . . . . . . . . . . . . . . 45 | 7.2.1. URI Query Parameter . . . . . . . . . . . . . . . . . 41 | |||
| 6.1. The WWW-Authenticate Response Header . . . . . . . . . . . 45 | 7.2.2. Form-Encoded Body Parameter . . . . . . . . . . . . . 41 | |||
| 6.1.1. The 'realm' Attribute . . . . . . . . . . . . . . . . 46 | 7.3. Cryptographic Tokens Requests . . . . . . . . . . . . . . 42 | |||
| 6.1.2. The 'authorization-uri' Attribute . . . . . . . . . . 46 | 7.3.1. The 'hmac-sha256' Algorithm . . . . . . . . . . . . . 43 | |||
| 6.1.3. The 'algorithms' Attribute . . . . . . . . . . . . . . 46 | 8. Identifying a Protected Resource . . . . . . . . . . . . . . . 46 | |||
| 6.1.4. The 'error' Attribute . . . . . . . . . . . . . . . . 46 | 8.1. The WWW-Authenticate Response Header . . . . . . . . . . . 46 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 46 | 8.1.1. The 'realm' Attribute . . . . . . . . . . . . . . . . 47 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 46 | 8.1.2. The 'authorization-uri' Attribute . . . . . . . . . . 47 | |||
| 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 46 | 8.1.3. The 'algorithms' Attribute . . . . . . . . . . . . . . 47 | |||
| Appendix A. Differences from OAuth 1.0a . . . . . . . . . . . . . 46 | 8.1.4. The 'error' Attribute . . . . . . . . . . . . . . . . 47 | |||
| Appendix B. Document History . . . . . . . . . . . . . . . . . . 47 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 47 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . . 47 | 11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . . 48 | Appendix A. Differences from OAuth 1.0a . . . . . . . . . . . . . 47 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 48 | Appendix B. Document History . . . . . . . . . . . . . . . . . . 48 | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | ||||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . . 48 | ||||
| 12.2. Informative References . . . . . . . . . . . . . . . . . . 49 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
| 1. Authors | 1. Authors | |||
| This specification was authored with the participation and based on | This specification was authored with the participation and based on | |||
| the work of Allen Tom (Yahoo!), Brian Eaton (Google), Brent Goldman | the work of Allen Tom (Yahoo!), Brian Eaton (Google), Brent Goldman | |||
| (Facebook), Luke Shepard (Facebook), Raffi Krikorian (Twitter), and | (Facebook), Luke Shepard (Facebook), Raffi Krikorian (Twitter), and | |||
| Yaron Goland (Microsoft). | Yaron Goland (Microsoft). | |||
| 2. Introduction | 2. Introduction | |||
| skipping to change at page 8, line 5 ¶ | skipping to change at page 8, line 5 ¶ | |||
| End-user credentials flow enable clients with direct access to the | End-user credentials flow enable clients with direct access to the | |||
| end-user's credentials to exchange them for an access token without | end-user's credentials to exchange them for an access token without | |||
| seeking additional authorization. These flows are only suitable when | seeking additional authorization. These flows are only suitable when | |||
| there is a high degree of trust between the end-user and the client. | there is a high degree of trust between the end-user and the client. | |||
| The end-user credentials flow defined by this specification is: | The end-user credentials flow defined by this specification is: | |||
| o Username and Password Flow - This flow is used in cases where the | o Username and Password Flow - This flow is used in cases where the | |||
| end-user trusts the client to handle its credentials but it is | end-user trusts the client to handle its credentials but it is | |||
| still undesirable for the client to store the end-user's username | still undesirable for the client to store the end-user's username | |||
| and password. This flow is described in Section 3.6.1. | and password. This flow is described in Section 4.1. | |||
| Autonomous flows enable clients to act for their own behalf (the | Autonomous flows enable clients to act for their own behalf (the | |||
| client is also the resource owner). The autonomous authorization | client is also the resource owner). The autonomous authorization | |||
| flows defined by this specifications are: | flows defined by this specifications are: | |||
| o Client Credentials Flow - The client uses its credentials to | o Client Credentials Flow - The client uses its credentials to | |||
| obtain an access token. This flow is described in Section 3.7.1. | obtain an access token. This flow is described in Section 5.1. | |||
| o Assertion Flow - The client presents an assertion such as a SAML | o Assertion Flow - The client presents an assertion such as a SAML | |||
| [OASIS.saml-core-2.0-os] assertion to the authorization server in | [OASIS.saml-core-2.0-os] assertion to the authorization server in | |||
| exchange for an access token. This flow is described in | exchange for an access token. This flow is described in | |||
| Section 3.7.2. | Section 5.2. | |||
| 2.3. Example | 2.3. Example | |||
| [[ Todo ]] | [[ Todo ]] | |||
| 2.4. Notational Conventions | 2.4. 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]. | |||
| skipping to change at page 9, line 17 ¶ | skipping to change at page 9, line 17 ¶ | |||
| the resource server when receiving a protected resource request, and | the resource server when receiving a protected resource request, and | |||
| by the authorization server when receiving a token refresh request. | by the authorization server when receiving a token refresh request. | |||
| In many cases it is desirable to issue access tokens with a shorter | In many cases it is desirable to issue access tokens with a shorter | |||
| lifetime than the duration of the authorization grant. However, it | lifetime than the duration of the authorization grant. However, it | |||
| may be undesirable to require the resource owner to authorize the | may be undesirable to require the resource owner to authorize the | |||
| request again. Instead, the authorization server issues a refresh | request again. Instead, the authorization server issues a refresh | |||
| token in addition to the access token. When the access token | token in addition to the access token. When the access token | |||
| expires, the client can request a new access token without involving | expires, the client can request a new access token without involving | |||
| the resource owner as long as the authorization grant is still valid. | the resource owner as long as the authorization grant is still valid. | |||
| The token refresh method is described in Section 4. | The token refresh method is described in Section 6. | |||
| 3.1. Authorization Endpoint | 3.1. Authorization Endpoint | |||
| Clients direct the resource owner to the authorization endpoint to | Clients direct the resource owner to the authorization endpoint to | |||
| approve their access request. Before granting access, the resource | approve their access request. Before granting access, the resource | |||
| owner first authenticates with the authorization server. The way in | owner first authenticates with the authorization server. The way in | |||
| which the authorization server authenticates the end-user (e.g. | which the authorization server authenticates the end-user (e.g. | |||
| username and password login, OpenID, session cookies) and in which | username and password login, OpenID, session cookies) and in which | |||
| the authorization server obtains the end-user's authorization, | the authorization server obtains the end-user's authorization, | |||
| including whether it uses a secure channel such as TLS/SSL, is beyond | including whether it uses a secure channel such as TLS/SSL, is beyond | |||
| the scope of this specification. However, the authorization server | the scope of this specification. However, the authorization server | |||
| MUST first verify the identity of the end-user. | MUST first verify the identity of the end-user. | |||
| The URI of the authorization endpoint can be found in the service | The URI of the authorization endpoint can be found in the service | |||
| documentation, or can be obtained by the client by making an | documentation, or can be obtained by the client by making an | |||
| unauthorized protected resource request (from the "WWW-Authenticate" | unauthorized protected resource request (from the "WWW-Authenticate" | |||
| response header auth-uri (Section 6.1.2) attribute). | response header auth-uri (Section 8.1.2) attribute). | |||
| The authorization endpoint advertised by the resource server MAY | The authorization endpoint advertised by the resource server MAY | |||
| include a query component as defined by [RFC3986] section 3. | include a query component as defined by [RFC3986] section 3. | |||
| Since requests to the authorization endpoint result in user | Since requests to the authorization endpoint result in user | |||
| authentication and the transmission of sensitive values, the | authentication and the transmission of sensitive values, 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/SSL (or a secure channel with equivalent | mechanism such as TLS/SSL (or a secure channel with equivalent | |||
| protections) when sending requests to the authorization endpoints. | protections) when sending requests to the authorization endpoints. | |||
| 3.2. Token Endpoint | 3.2. Token Endpoint | |||
| After obtaining authorization from the resource owner, clients | After obtaining authorization from the resource owner, clients | |||
| request an access token from the authorization server's token | request an access token from the authorization server's token | |||
| endpoint. | endpoint. | |||
| The URI of the token endpoint can be found in the service | The URI of the token endpoint can be found in the service | |||
| documentation, or can be obtained by the client by making an | documentation, or can be obtained by the client by making an | |||
| unauthorized protected resource request (from the "WWW-Authenticate" | unauthorized protected resource request (from the "WWW-Authenticate" | |||
| response header token-uri (Section 6.1.2) attribute). | response header token-uri (Section 8.1.2) attribute). | |||
| The token endpoint advertised by the resource server MAY include a | The token endpoint advertised by the resource server MAY include a | |||
| query component as defined by [RFC3986] section 3. | query component as defined by [RFC3986] section 3. | |||
| 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 such as TLS/SSL (or a secure channel with equivalent | mechanism such as TLS/SSL (or a secure channel with equivalent | |||
| protections) when sending requests to the token endpoints. | protections) when sending requests to the token endpoints. | |||
| 3.2.1. Response Format | ||||
| Authorization servers respond to client requests by including a set | ||||
| of response parameters in the entity body of the HTTP response. The | ||||
| response uses the "application/json" media type as defined by | ||||
| [RFC4627]. | ||||
| The parameters are serialized into a JSON structure by adding each | ||||
| parameter at the highest strucutre level. Parameter names and string | ||||
| values are included as JSON strings. Numerical number are included | ||||
| as JSON numbers. | ||||
| The authorization server MUST include the HTTP "Cache-Control" | The authorization server MUST include the HTTP "Cache-Control" | |||
| response header field with a value of "no-store" in any response | response header field with a value of "no-store" in any response | |||
| containing tokens, secrets, or other sensitive information. | containing tokens, secrets, or other sensitive information. | |||
| 3.2.1.1. Access Token Response | ||||
| After recieving and verifying a valid and authorized access token | ||||
| request from the client (as described in each of the flows below), | ||||
| the authorization server constructs a JSON-formatted response which | ||||
| includes the common parameters set as well as additional flow- | ||||
| specific parameters. The formatted parameters are sent to the client | ||||
| in the entity body of the HTTP response with a 200 status code (OK). | ||||
| The token response contains the following common parameters: | ||||
| access_token | ||||
| REQUIRED. The access token issued by the authorization server. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| refresh_token | ||||
| OPTIONAL. The refresh token used to obtain new access tokens | ||||
| using the same end-user access grant as described in Section 6. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example (line breaks are for display purposes only): | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: application/json | ||||
| Cache-Control: no-store | ||||
| {"access_token":"SlAV32hkKG","expires_in":3600, | ||||
| "refresh_token":"8xLOxBtZp8"} | ||||
| 3.2.1.2. Error Response | ||||
| If the token request is invalid or unauthorized, the authorization | ||||
| server constructs a JSON-formatted response which includes the common | ||||
| parameters set as well as additional flow-specific parameters. The | ||||
| formatted parameters are sent to the client in the entity body of the | ||||
| HTTP response with a 400 status code (Bad Request). | ||||
| The response contains the following common parameter: | ||||
| error | ||||
| REQUIRED. The parameter value MUST be set to one of the values | ||||
| specified by each flow. | ||||
| For example: | ||||
| HTTP/1.1 400 Bad Request | ||||
| Content-Type: application/json | ||||
| Cache-Control: no-store | ||||
| {"error"="incorrect_client_credentials"} | ||||
| 3.3. Flow Parameters | 3.3. Flow Parameters | |||
| The sizes of tokens and other values received from the authorization | The sizes of tokens and other values received from the authorization | |||
| server, are left undefined by this specification. Clients should | server, are left undefined by this specification. Clients should | |||
| avoid making assumptions about value sizes. Servers should document | avoid making assumptions about value sizes. Servers should document | |||
| the expected size of any value they issue. | the expected size of any value they issue. | |||
| 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. | |||
| skipping to change at page 13, line 27 ¶ | skipping to change at page 14, line 35 ¶ | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| 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. The redirection URI | to pre-register their redirection URI. Authorization servers | |||
| MUST NOT include a query component as defined by [RFC3986] | MAY restritc the redirection URI to not include a query | |||
| section 3 if the "state" parameter is present. | component as defined by [RFC3986] section 3. | |||
| state | state | |||
| OPTIONAL. An opaque value used by the client to maintain state | OPTIONAL. An opaque value used by the client to maintain state | |||
| between the request and callback. The authorization server | between the request and callback. The authorization server | |||
| includes this value when redirecting the user-agent back to the | includes this value when redirecting the user-agent back to the | |||
| client. | client. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| immediate | immediate | |||
| OPTIONAL. The parameter value must be set to "true" or | OPTIONAL. The parameter value must be set to "true" or | |||
| "false". If set to "true", the authorization server MUST NOT | "false". If set to "true", the authorization server MUST NOT | |||
| prompt the end-user to authenticate or approve access. | prompt the end-user to authenticate or approve access. | |||
| Instead, the authorization server attempts to establish the | Instead, the authorization server attempts to establish the | |||
| end-user's identity via other means (e.g. browser cookies) and | end-user's identity via other means (e.g. browser cookies) and | |||
| checks if the end-user has previously approved an identical | checks if the end-user has previously approved an identical | |||
| access request by the same client and if that access grant is | access request by the same client and if that access grant is | |||
| still active. If the authorization server does not support an | still active. If the authorization server does not support an | |||
| immediate check or if it is unable to establish the end-user's | immediate check or if it is unable to establish the end-user's | |||
| identity or approval status, it MUST deny the request without | identity or approval status, it MUST deny the request without | |||
| prompting the end-user. Defaults to "false" if omitted. | prompting the end-user. Defaults to "false" if omitted. | |||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| 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 HTTPS request (line breaks are for display purposes only): | |||
| GET /authorize?type=user_agent&client_id=s6BhdRkqt3& | GET /authorize?type=user_agent&client_id=s6BhdRkqt3& | |||
| redirect_uri=https%3A%2F%2FEexample%2Ecom%2Frd HTTP/1.1 | redirect_uri=https%3A%2F%2FEexample%2Ecom%2Frd HTTP/1.1 | |||
| skipping to change at page 17, line 47 ¶ | skipping to change at page 19, line 27 ¶ | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| 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 MAY require the client to | completed. The authorization server MAY require the client to | |||
| pre-register their redirection URI. The redirection URI MUST | pre-register their redirection URI. Authorization servers MAY | |||
| NOT include a query component as defined by [RFC3986] section 3 | restritc the redirection URI to not include a query component | |||
| if the "state" parameter is present. | as defined by [RFC3986] section 3. | |||
| state | state | |||
| OPTIONAL. An opaque value used by the client to maintain state | OPTIONAL. An opaque value used by the client to maintain state | |||
| between the request and callback. The authorization server | between the request and callback. The authorization server | |||
| includes this value when redirecting the user-agent back to the | includes this value when redirecting the user-agent back to the | |||
| client. | client. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| immediate | immediate | |||
| OPTIONAL. The parameter value must be set to "true" or | OPTIONAL. The parameter value must be set to "true" or | |||
| "false". If set to "true", the authorization server MUST NOT | "false". If set to "true", the authorization server MUST NOT | |||
| prompt the end-user to authenticate or approve access. | prompt the end-user to authenticate or approve access. | |||
| Instead, the authorization server attempts to establish the | Instead, the authorization server attempts to establish the | |||
| end-user's identity via other means (e.g. browser cookies) and | end-user's identity via other means (e.g. browser cookies) and | |||
| checks if the end-user has previously approved an identical | checks if the end-user has previously approved an identical | |||
| access request by the same client and if that access grant is | access request by the same client and if that access grant is | |||
| still active. If the authorization server does not support an | still active. If the authorization server does not support an | |||
| immediate check or if it is unable to establish the end-user's | immediate check or if it is unable to establish the end-user's | |||
| skipping to change at page 20, line 33 ¶ | skipping to change at page 22, line 24 ¶ | |||
| code | code | |||
| REQUIRED. The verification code received from the | REQUIRED. The verification 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. | |||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | 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 authorization server MUST verify that the verification code, | The authorization server MUST verify that the verification 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 an access token and delivers it to the | authorization server issues a successful response as described in | |||
| client in the HTTP response body using the | Section 3.2.1.1. | |||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 200 status code (OK). | ||||
| The response contains the following parameters: | ||||
| access_token | ||||
| REQUIRED. The access token issued by the authorization server. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| refresh_token | ||||
| OPTIONAL. The refresh token used to obtain new access tokens | ||||
| using the same end-user access grant as described in Section 4. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| access_token=SlAV32hkKG&expires_in=3600&refresh_token=8xLOxBtZp8 | {"access_token":"SlAV32hkKG","expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8"} | ||||
| If the request is invalid, the authorization server returns an error | If the request is invalid, the authorization server returns an error | |||
| message in the HTTP response body using the | response as described in Section 3.2.1.2 with one of the following | |||
| "application/x-www-form-urlencoded" content type as defined by | error codes: | |||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). | ||||
| The response contains the following parameter: | o "redirect_uri_mismatch" | |||
| error | o "bad_verification_code" | |||
| OPTIONAL. The parameter value MUST be set to either | ||||
| "redirect_uri_mismatch", "bad_verification_code", | o "incorrect_client_credentials" | |||
| "incorrect_client_credentials". | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=bad_verification_code | {"error"="incorrect_client_credentials"} | |||
| 3.5.3. Device Flow | 3.5.3. Device Flow | |||
| The device flow is a user delegation flow suitable for clients | The device flow is a user delegation flow suitable for clients | |||
| executing on devices which do not have an easy data-entry method | executing on devices which do not have an easy data-entry method | |||
| (e.g. game consoles or media hub), but where the end-user has | (e.g. game consoles or media hub), but where the end-user has | |||
| separate access to a user-agent on another computer or device (e.g. | separate access to a user-agent on another computer or device (e.g. | |||
| home computer, a laptop, or a smartphone). The client is incapable | home computer, a laptop, or a smartphone). The client is incapable | |||
| of receiving incoming requests from the authorization server | of receiving incoming requests from the authorization server | |||
| (incapable of acting as an HTTP server). | (incapable of acting as an HTTP server). | |||
| skipping to change at page 23, line 45 ¶ | skipping to change at page 25, line 32 ¶ | |||
| codes from the authorization server by making an HTTP "GET" request | codes from the authorization server by making an HTTP "GET" request | |||
| to the token endpoint. The client constructs a request URI by adding | to the token endpoint. The client constructs a request URI by adding | |||
| the following parameters to the request: | the following parameters to the request: | |||
| type | type | |||
| REQUIRED. The parameter value MUST be set to "device_code". | REQUIRED. The parameter value MUST be set to "device_code". | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | breaks are for display purposes only): | |||
| GET /token?type=device_code&client_id=s6BhdRkqt3 | GET /token?type=device_code&client_id=s6BhdRkqt3 | |||
| HTTP/1.1 | HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| In response, the authorization server generates a verification code | In response, the authorization server generates a verification code | |||
| and a user code and includes them in the HTTP response body using the | and a user code and includes them in the HTTP response body using the | |||
| "application/x-www-form-urlencoded" format as defined by | "application/json" format as desribed by Section 3.2.1 with a 200 | |||
| [W3C.REC-html40-19980424] with a 200 status code (OK). The response | status code (OK). The response contains the following parameters: | |||
| contains the following parameters: | ||||
| code | code | |||
| REQUIRED. The verification code. | REQUIRED. The verification code. | |||
| user_code | user_code | |||
| REQUIRED. The user code. | REQUIRED. The user code. | |||
| user_uri | user_uri | |||
| REQUIRED. The user authorization URI on the authorization | REQUIRED. The user authorization URI on the authorization | |||
| server. | server. | |||
| skipping to change at page 24, line 33 ¶ | skipping to change at page 26, line 27 ¶ | |||
| lifetime. | lifetime. | |||
| interval | interval | |||
| OPTIONAL. The minimum amount of time in seconds that the | OPTIONAL. The minimum amount of time in seconds that the | |||
| client SHOULD wait between polling requests to the token | client SHOULD wait between polling requests to the token | |||
| endpoint. | endpoint. | |||
| For example (line breaks are for display purposes only): | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| code=74tq5miHKB&user_code=94248&user_uri=http%3A%2F%2 | {"code":"74tq5miHKB","user_code":"94248","user_uri":"http%3A%2F%2 | |||
| Fwww%2Eexample%2Ecom%2Fdevice&interval=5 | Fwww%2Eexample%2Ecom%2Fdevice","interval"=5} | |||
| The client displays the user code and the user authorization URI to | The client displays the user code and the user authorization URI to | |||
| the end-user, and instructs the end-user to visit the URI using a | the end-user, and instructs the end-user to visit the URI using a | |||
| user-agent and enter the user code. | user-agent and enter the user code. | |||
| The end-user manually types the provided URI and authenticates with | The end-user manually types the provided URI and authenticates with | |||
| the authorization server. The authorization server prompts the end- | the authorization server. The authorization server prompts the end- | |||
| user to authorize the client's request by entering the user code | user to authorize the client's request by entering the user code | |||
| provided by the client. Once the end-user approves or denies the | provided by the client. Once the end-user approves or denies the | |||
| request, the authorization server informs the end-user to return to | request, the authorization server informs the end-user to return to | |||
| skipping to change at page 25, line 33 ¶ | skipping to change at page 27, line 26 ¶ | |||
| REQUIRED. The parameter value MUST be set to "device_token". | REQUIRED. The parameter value MUST be set to "device_token". | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| code | code | |||
| The verification code received from the authorization server. | The verification code received from the authorization server. | |||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | breaks are for display purposes only): | |||
| GET /token?type=device_token&client_id=s6BhdRkqt3 | GET /token?type=device_token&client_id=s6BhdRkqt3 | |||
| &code=J2vC42OifV HTTP/1.1 | &code=J2vC42OifV HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| 3.5.3.2.1. End-user Grants Authorization | ||||
| If the end-user authorized the request, the authorization server | If the end-user authorized the request, the authorization server | |||
| issues an access token and delivers it to the client by including it | issues an access token response as described in Section 3.2.1.1. | |||
| in the HTTP response body using the | ||||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 200 status code (OK). The response | ||||
| contains the following parameters: | ||||
| access_token | ||||
| REQUIRED. The access token. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| refresh_token | ||||
| OPTIONAL. The refresh token. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| access_token=FJQbwq9OD8&expires_in=3600 | {"access_token":"SlAV32hkKG","expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8"} | ||||
| 3.5.3.2.2. End-user Denies Authorization | If the request is invalid, the authorization server returns an error | |||
| response as described in Section 3.2.1.2 with one of the following | ||||
| error codes: | ||||
| If the end-user denied the request, the authorization server provides | o "authorization_declined" | |||
| the client with the error message in the HTTP response body using the | ||||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). The | ||||
| response contains the following parameters: | ||||
| error | o "bad_verification_code" | |||
| REQUIRED. Value must be set to "authorization_declined". | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=authorization_declined | ||||
| 3.5.3.2.3. End-user Authorization Pending or Expired | {"error"="authorization_declined"} | |||
| If the end-user authorization is pending or expired without receiving | If the end-user authorization is pending or expired without receiving | |||
| any response from the end-user, or the client is exceeding the | any response from the end-user, or the client is exceeding the | |||
| allowed polling interval, the authorization server provides the | allowed polling interval, the authorization server returns an error | |||
| client with the error message in the HTTP response body using the | response as described in Section 3.2.1.2 with one of the following | |||
| "application/x-www-form-urlencoded" content type as defined by | error codes: | |||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). The | o "'authorization_pending" | |||
| response contains the following parameters: | ||||
| error | o "slow_down" | |||
| REQUIRED. Value MUST be set to "authorization_pending", | ||||
| "slow_down", or "code_expired". | o "code_expired" | |||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=authorization_pending | {"error"="authorization_pending"} | |||
| 3.6. End-user Credentials Flows | 4. End-user Credentials Flows | |||
| End-user credential flows are used to grant client access to | End-user credential flows are used to grant client access to | |||
| protected resources by the end-user directly sharing the end-user's | protected resources by the end-user directly sharing the end-user's | |||
| username and password with the client. Unlike user delegation flows, | username and password with the client. Unlike user delegation flows, | |||
| end-user credentials flows require a much higher degree of trust | end-user credentials flows require a much higher degree of trust | |||
| between the client and end-user. | between the client and end-user. | |||
| These flows are suitable in cases where the end-user already has a | These flows are suitable in cases where the end-user already has a | |||
| trust relationship with the client, such as its computer operating | trust relationship with the client, such as its computer operating | |||
| system or highly privileged applications. Authorization servers | system or highly privileged applications. Authorization servers | |||
| SHOULD take special care when enabling user credentials flows, and | SHOULD take special care when enabling user credentials flows, and | |||
| SHOULD only do so when other delegation flows are not viable. | SHOULD only do so when other delegation flows are not viable. | |||
| However, unlike the HTTP Basic authentication scheme defined in | However, unlike the HTTP Basic authentication scheme defined in | |||
| [RFC2617], the end-user's credentials are used in a single request | [RFC2617], the end-user's credentials are used in a single request | |||
| and are exchanged for an access token and refresh token which | and are exchanged for an access token and refresh token which | |||
| eliminates the client need to store them for future use. | eliminates the client need to store them for future use. | |||
| 3.6.1. Username and Password Flow | 4.1. Username and Password Flow | |||
| The username and password flow is an end-user credentials flow | The username and password flow is an end-user credentials flow | |||
| suitable for clients capable of asking end users for their usernames | suitable for clients capable of asking end users for their usernames | |||
| and passwords. It is also used to migrate existing clients using | and passwords. It is also used to migrate existing clients using | |||
| direct authentication schemes such as HTTP Basic or Digest | direct authentication schemes such as HTTP Basic or Digest | |||
| authentication to OAuth by converting the end-user credentials stored | authentication to OAuth by converting the end-user credentials stored | |||
| with tokens. | with tokens. | |||
| The methods through which the client prompts end users for their | The methods through which the client prompts end users for their | |||
| usernames and passwords is beyond the scope of this specification. | usernames and passwords is beyond the scope of this specification. | |||
| skipping to change at page 28, line 33 ¶ | skipping to change at page 30, line 14 ¶ | |||
| (A) The end-user provides the client with its username and password. | (A) The end-user provides the client with its username and password. | |||
| (B) The client sends an access token request to the authorization | (B) The client sends an access token request to the authorization | |||
| server and includes its client identifier and client secret, and | server and includes its client identifier and client secret, and | |||
| the end-user's username and password. | the end-user's username and password. | |||
| (C) The authorization server validates the end-user credentials and | (C) The authorization server validates the end-user credentials and | |||
| the client credentials and issues an access token. | the client credentials and issues an access token. | |||
| 3.6.1.1. Client Requests Access Token | 4.1.1. Client Requests Access Token | |||
| The client requests an access token by making an HTTP "POST" request | The client requests an access token by making an HTTP "POST" request | |||
| to the token endpoint. The client constructs a request URI by adding | to the token endpoint. The client constructs a request URI by adding | |||
| the following parameters to the request: | the following parameters to the request: | |||
| type | type | |||
| REQUIRED. The parameter value MUST be set to "username". | REQUIRED. The parameter value MUST be set to "username". | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| skipping to change at page 29, line 11 ¶ | skipping to change at page 30, line 36 ¶ | |||
| client_secret | client_secret | |||
| REQUIRED. The client secret as described in Section 3.4. | REQUIRED. The client secret as described in Section 3.4. | |||
| OPTIONAL if no client secret was issued. | OPTIONAL if no client secret was issued. | |||
| 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. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | breaks are for display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| type=username&client_id=s6BhdRkqt3&client_secret= | type=username&client_id=s6BhdRkqt3&client_secret= | |||
| 47HDu8s&username=johndoe&password=A3ddj3w | 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 issue an access token and deliver | end-user credentials and if valid issues an access token response as | |||
| to the client in the HTTP response body using the | described in Section 3.2.1.1. | |||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 200 status code (OK). | ||||
| The response contains the following parameters: | ||||
| access_token | ||||
| REQUIRED. The access token. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| refresh_token | ||||
| OPTIONAL. The refresh token. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| access_token=FJQbwq9OD8&refresh_token=gO3CHNqpH8 | {"access_token":"SlAV32hkKG","expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8"} | ||||
| If the request is invalid, the authorization server returns an error | If the request is invalid, the authorization server returns an error | |||
| message in the HTTP response body using the | response as described in Section 3.2.1.2 with one of the following | |||
| "application/x-www-form-urlencoded" content type as defined by | error codes: | |||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). | ||||
| The response contains the following parameter: | o "incorrect_client_credentials" | |||
| error | o "unauthorized_client'" - The client is not permitted to use this | |||
| OPTIONAL. The parameter value MUST be set to either | flow. | |||
| "incorrect_client_credentials" or "unauthorized_client" (the | ||||
| client is not permitted to use this flow). | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=incorrect_client_credentials | {"error"="incorrect_client_credentials"} | |||
| 3.7. Autonomous Client Flows | 5. Autonomous Client Flows | |||
| Autonomous client flows are used to grant client access to protected | Autonomous client flows are used to grant client access to protected | |||
| resources controlled by the client (i.e. the client is the resource | resources controlled by the client (i.e. the client is the resource | |||
| owner). For example, these flows are useful when a service provides | owner). For example, these flows are useful when a service provides | |||
| both client-specific resources in addition to end-user resources. | both client-specific resources in addition to end-user resources. | |||
| 3.7.1. Client Credentials Flow | 5.1. Client Credentials Flow | |||
| The client credentials flow is used when the client acts autonomously | The client credentials flow is used when the client acts autonomously | |||
| without acting on behalf of a separate resource owner. The client | without acting on behalf of a separate resource owner. The client | |||
| secret is assumed to be high-entropy since it is not designed to be | secret is assumed to be high-entropy since it is not designed to be | |||
| memorized by an end-user. | memorized by an end-user. | |||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| | | | | | | | | | | |||
| | |>--(A)--- Client Credentials ---->| Authorization | | | |>--(A)--- Client Credentials ---->| Authorization | | |||
| | Client | | Server | | | Client | | Server | | |||
| skipping to change at page 31, line 24 ¶ | skipping to change at page 32, line 38 ¶ | |||
| The client credential flow illustrated in Figure 7 includes the | The client credential flow illustrated in Figure 7 includes the | |||
| following steps: | following steps: | |||
| (A) The client sends an access token request to the authorization | (A) The client sends an access token request to the authorization | |||
| server and includes its client identifier and client secret. | server and includes its client identifier and client secret. | |||
| (B) The authorization server validates the client credentials and | (B) The authorization server validates the client credentials and | |||
| issues an access token. | issues an access token. | |||
| 3.7.1.1. Client Requests Access Token | 5.1.1. Client Requests Access Token | |||
| The client requests an access token by making an HTTP "POST" request | The client requests an access token by making an HTTP "POST" request | |||
| to the token endpoint. The client constructs a request URI by adding | to the token endpoint. The client constructs a request URI by adding | |||
| the following parameters to the request: | the following parameters to the request: | |||
| type | type | |||
| REQUIRED. The parameter value MUST be set to | REQUIRED. The parameter value MUST be set to | |||
| "client_credentials". | "client_credentials". | |||
| client_id | client_id | |||
| REQUIRED. The client identifier as described in Section 3.4. | REQUIRED. The client identifier as described in Section 3.4. | |||
| client_secret | client_secret | |||
| REQUIRED. The client secret as described in Section 3.4. | REQUIRED. The client secret as described in Section 3.4. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | breaks are for display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| type=client_credentials&client_id=s6BhdRkqt3&client_secret=47HDu8s | type=client_credentials&client_id=s6BhdRkqt3&client_secret=47HDu8s | |||
| The authorization server MUST validate the client credentials and if | The authorization server MUST validate the client credentials and if | |||
| valid issue an access token and deliver to the client in the HTTP | valid issues an access token response as described in | |||
| response body using the "application/x-www-form-urlencoded" content | Section 3.2.1.1. | |||
| type as defined by [W3C.REC-html40-19980424] with a 200 status code | ||||
| (OK). | ||||
| The response contains the following parameters: | ||||
| access_token | ||||
| REQUIRED. The access token. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| refresh_token | ||||
| OPTIONAL. The refresh token. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| access_token=FJQbwq9OD8 | {"access_token":"SlAV32hkKG","expires_in":3600, | |||
| "refresh_token":"8xLOxBtZp8"} | ||||
| If the request is invalid, the authorization server returns an error | If the request is invalid, the authorization server returns an error | |||
| message in the HTTP response body using the | response as described in Section 3.2.1.2 with one of the following | |||
| "application/x-www-form-urlencoded" content type as defined by | error codes: | |||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). | ||||
| The response contains the following parameter: | ||||
| error | o "incorrect_client_credentials" | |||
| OPTIONAL. The parameter value MUST be set to | ||||
| "incorrect_client_credentials". | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=incorrect_client_credentials | {"error"="incorrect_client_credentials"} | |||
| 3.7.2. Assertion Flow | 5.2. Assertion Flow | |||
| The assertion flow is used when a client wishes to exchange an | The assertion flow is used when a client wishes to exchange an | |||
| existing security token or assertion for an access token. This flow | existing security token or assertion for an access token. This flow | |||
| is suitable when the client is acting autonomously or on behalf of | is suitable when the client is acting autonomously or on behalf of | |||
| the end-user (based on the content of the assertion used). | the end-user (based on the content of the assertion used). | |||
| The assertion flow requires the client to obtain a assertion (such as | The assertion flow requires the client to obtain a assertion (such as | |||
| a SAML [OASIS.saml-core-2.0-os] assertion) from an assertion issuer | a SAML [OASIS.saml-core-2.0-os] assertion) from an assertion issuer | |||
| or to self-issue an assertion prior to initiating the flow. The | or to self-issue an assertion prior to initiating the flow. The | |||
| assertion format, the process by which the assertion is obtained, and | assertion format, the process by which the assertion is obtained, and | |||
| the method of validating the assertion are defined by the assertion | the method of validating the assertion are defined by the assertion | |||
| issuer and the authorization server, and are beyond the scope of this | issuer and the authorization server, and are beyond the scope of this | |||
| specification. | specification. | |||
| The client credentials flow is used when the client acts autonomously | ||||
| without acting on behalf of a separate resource owner. | ||||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| | | | | | | | | | | |||
| | |>--(A)------ Assertion ---------->| Authorization | | | |>--(A)------ Assertion ---------->| Authorization | | |||
| | Client | | Server | | | Client | | Server | | |||
| | |<--(B)---- Access Token ---------<| | | | |<--(B)---- Access Token ---------<| | | |||
| | | | | | | | | | | |||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| Figure 8 | Figure 8 | |||
| The client credential flow illustrated in Figure 8 includes the | The assertion flow illustrated in Figure 8 includes the following | |||
| following steps: | steps: | |||
| (A) The client sends an access token request to the authorization | (A) The client sends an access token request to the authorization | |||
| server and includes an assertion. | server and includes an assertion. | |||
| (B) The authorization server validates the assertion and issues an | (B) The authorization server validates the assertion and issues an | |||
| access token. | access token. | |||
| 3.7.2.1. Client Requests Access Token | 5.2.1. Client Requests Access Token | |||
| The client requests an access token by making an HTTP "POST" request | The client requests an access token by making an HTTP "POST" request | |||
| to the token endpoint. The client constructs a request URI by adding | to the token endpoint. The client constructs a request URI by adding | |||
| the following parameters to the request: | the following parameters to the request: | |||
| type | type | |||
| REQUIRED. The parameter value MUST be set to "assertion". | REQUIRED. The parameter value MUST be set to "assertion". | |||
| format | format | |||
| 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. | |||
| scope | ||||
| OPTIONAL. The scope of the access request expressed as a list | ||||
| of space-delimited strings. 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 additional access range to the requested | ||||
| scope. | ||||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line | For example, the client makes the following HTTPS request (line | |||
| breaks are for display purposes only): | breaks are for display purposes only): | |||
| POST /token HTTP/1.1 | POST /token HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| type=assertion&format=_______&assertion=_______ | type=assertion&format=_______&assertion=_______ | |||
| The authorization server MUST validate the assertion and if valid | The authorization server MUST validate the assertion and if valid | |||
| issue an access token and deliver to the client in the HTTP response | issues an access token response as described in Section 3.2.1.1. The | |||
| body using the "application/x-www-form-urlencoded" content type as | authorization server SHOULD NOT issue a refresh token. | |||
| defined by [W3C.REC-html40-19980424] with a 200 status code (OK). | ||||
| The response contains the following parameters: | ||||
| access_token | ||||
| REQUIRED. The access token. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| access_token_secret | ||||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | For example (line breaks are for display purposes only): | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| access_token=FJQbwq9OD8 | {"access_token":"SlAV32hkKG"} | |||
| If the assertion is invalid, the authorization server returns an | If the request is invalid, the authorization server returns an error | |||
| error message in the HTTP response body using the | response as described in Section 3.2.1.2 with one of the following | |||
| "application/x-www-form-urlencoded" content type as defined by | error codes: | |||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). | ||||
| The response contains the following parameter: | o "invalid_assertion" | |||
| error | o "unknown_format" | |||
| OPTIONAL. The parameter value MUST be set to either | ||||
| "invalid_assertion" or "unknown_format". | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=incorrect_credentials | {"error"="invalid_assertion"} | |||
| 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. Refreshing an Access Token | 6. Refreshing an Access Token | |||
| Token refresh is used when the lifetime of an access token is shorter | Token refresh is used when the lifetime of an access token is shorter | |||
| than the lifetime of the authorization grant. It allows clients to | than the lifetime of the authorization grant. It allows clients to | |||
| obtain a new access token without having to go through the | obtain a new access token without having to go through the | |||
| authorization flow again or involve the resource owner. It is also | authorization flow again or involve the resource owner. It is also | |||
| used to obtain a new token with different security properties (e.g. | used to obtain a new token with different security properties (e.g. | |||
| bearer token, token with shared symmetric secret). | bearer token, token with shared symmetric secret). | |||
| +--------+ Client Credentials, +---------------+ | +--------+ Client Credentials, +---------------+ | |||
| | | Refresh Token, | | | | | Refresh Token, | | | |||
| | |>--(A)----- & Secret Type ------->| Authorization | | | |>--(A)----- & Secret Type ------->| Authorization | | |||
| | Client | | Server | | | Client | | Server | | |||
| | |<--(B)----- Access Token --------<| | | | |<--(B)----- Access Token --------<| | | |||
| | | & Optional Secret | | | | | & Optional Secret | | | |||
| +--------+ +---------------+ | +--------+ +---------------+ | |||
| skipping to change at page 36, line 37 ¶ | skipping to change at page 37, line 35 ¶ | |||
| client_secret | client_secret | |||
| REQUIRED if the client was issued a secret. The client secret. | REQUIRED if the client was issued a secret. The client secret. | |||
| 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. | |||
| secret_type | secret_type | |||
| OPTIONAL. The access token secret type as described by | OPTIONAL. The access token secret type as described by | |||
| Section 5.3. If omitted, the authorization server will issue a | Section 7.3. If omitted, the authorization server will issue a | |||
| bearer token (an access token without a matching secret) as | bearer token (an access token without a matching secret) as | |||
| described by Section 5.2. | described by Section 7.2. | |||
| For example, the client makes the following HTTPS request (line break | For example, the client makes the following HTTPS request (line break | |||
| are for display purposes only): | 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=refresh_token&client_id=s6BhdRkqt3&client_secret=8eSEIpnqmM | type=refresh_token&client_id=s6BhdRkqt3&client_secret=8eSEIpnqmM | |||
| &refresh_token=n4E9O119d&secret_type=hmac-sha256 | &refresh_token=n4E9O119d&secret_type=hmac-sha256 | |||
| The authorization server MUST verify the client credential, the | verify the client credential, the validity of the refresh token, and | |||
| validity of the refresh token, and that the resource owner's | that the resource owner's authorization is still valid. If the | |||
| authorization is still valid. If the request is valid, the | request is valid, the authorization server issues an access token | |||
| authorization server issues a new access token and includes the | response as described in Section 3.2.1.1. The authorization server | |||
| following parameters in the HTTP response body using the | MAY issue a new token. | |||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 200 status code (OK): | ||||
| access_token | ||||
| REQUIRED. The access token. | ||||
| expires_in | ||||
| OPTIONAL. The duration in seconds of the access token | ||||
| lifetime. | ||||
| access_token_secret | For example (line breaks are for display purposes only): | |||
| REQUIRED if requested by the client. The corresponding access | ||||
| token secret as requested by the client. | ||||
| For example: | HTTP/1.1 200 OK | |||
| Content-Type: application/json | ||||
| Cache-Control: no-store | ||||
| HTTP/1.1 200 OK | {"access_token":"SlAV32hkKG","expires_in":3600} | |||
| Content-Type: application/x-www-form-urlencoded | ||||
| access_token=8F44J2HGMl&access_token_secret=hfd83hjd&expires_in=3600 | If the request is invalid, the authorization server returns an error | |||
| response as described in Section 3.2.1.2 with one of the following | ||||
| error codes: | ||||
| If the request fails verification, the authorization server returns | o "incorrect_client_credentials" | |||
| an error message in the HTTP response body using the | ||||
| "application/x-www-form-urlencoded" content type as defined by | ||||
| [W3C.REC-html40-19980424] with a 400 status code (Bad Request). | ||||
| The response contains the following parameter: | o "authorization_expired" | |||
| error | o "unsupported_secret_type" | |||
| OPTIONAL. The parameter value MUST be set to either | ||||
| "incorrect_credentials", "authorization_expired", or | ||||
| "unsupported_secret_type". | ||||
| For example: | For example: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Content-Type: application/x-www-form-urlencoded | Content-Type: application/json | |||
| Cache-Control: no-store | ||||
| error=incorrect_credentials | {"error"="incorrect_client_credentials"} | |||
| 5. Accessing a Protected Resource | 7. 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 methods used by the resource server to | the resource server. The methods used by the resource server to | |||
| validate the access token are beyond the scope of this specification, | validate the access token are beyond the scope of this specification, | |||
| but generally involve an interaction or coordination between the | but generally involve an interaction or coordination between the | |||
| resource server and authorization server. | resource server and authorization server. | |||
| The method in which a client uses an access token depends on the | The method in which a client uses an access token depends on the | |||
| security properties of the access tokens. By default, access tokens | security properties of the access tokens. By default, access tokens | |||
| are issued without a matching secret. Clients MAY request an access | are issued without a matching secret. Clients MAY request an access | |||
| skipping to change at page 38, line 42 ¶ | skipping to change at page 39, line 29 ¶ | |||
| When an access token includes a matching secret, the secret is not | When an access token includes a matching secret, the secret is not | |||
| included directly in the request but is used instead to generate a | included directly in the request but is used instead to generate a | |||
| cryptographic signature of the request. The signature can only be | cryptographic signature of the request. The signature can only be | |||
| generated and verified by entities with access to the secret. | generated and verified by entities with access to the secret. | |||
| Clients SHOULD NOT make authenticated requests with an access token | Clients SHOULD NOT make authenticated requests with an access token | |||
| to unfamiliar resource servers, especially when using bearer tokens, | to unfamiliar resource servers, especially when using bearer tokens, | |||
| regardless of the presence of a secure channel. | regardless of the presence of a secure channel. | |||
| 5.1. The Authorization Request Header | 7.1. The Authorization Request Header | |||
| The "Authorization" request header field is used by clients to make | The "Authorization" request header field is used by clients to make | |||
| both bearer token and cryptographic token requests. When making | both bearer token and cryptographic token requests. When making | |||
| bearer token requests, the client uses the "token" attribute to | bearer token requests, the client uses the "token" attribute to | |||
| include the access token in the request without any of the other | include the access token in the request without any of the other | |||
| attributes. Additional methods for making bearer token requests are | attributes. Additional methods for making bearer token requests are | |||
| described in Section 5.2. | described in Section 7.2. | |||
| For example: | For example: | |||
| GET /resource HTTP/1.1 | GET /resource HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Authorization: Token token="vF9dft4qmT" | Authorization: Token token="vF9dft4qmT" | |||
| When making a cryptographic token request (using an access token with | When making a cryptographic token request (using an access token with | |||
| a matching secret) the client uses the "token" attribute to include | a matching secret) the client uses the "token" attribute to include | |||
| the access token in the request, and uses the "nonce", "timestamp", | the access token in the request, and uses the "nonce", "timestamp", | |||
| skipping to change at page 40, line 5 ¶ | skipping to change at page 40, line 36 ¶ | |||
| token-id = "token" "=" <"> token <"> | token-id = "token" "=" <"> token <"> | |||
| timestamp = "timestamp" "=" <"> 1*DIGIT <"> | timestamp = "timestamp" "=" <"> 1*DIGIT <"> | |||
| nonce = "nonce" "=" <"> token <"> | nonce = "nonce" "=" <"> token <"> | |||
| algorithm = "algorithm" "=" algorithm-name | algorithm = "algorithm" "=" algorithm-name | |||
| algorithm-name = "hmac-sha256" / | algorithm-name = "hmac-sha256" / | |||
| token | token | |||
| signature = "signature" "=" <"> token <"> | signature = "signature" "=" <"> token <"> | |||
| 5.2. Bearer Token Requests | 7.2. Bearer Token Requests | |||
| Clients make bearer token requests by including the access token | Clients make bearer token requests by including the access token | |||
| using the HTTP "Authorization" request header with the "Token" | using the HTTP "Authorization" request header with the "Token" | |||
| authentication scheme as described in Section 5.1. The access token | authentication scheme as described in Section 7.1. The access token | |||
| is included using the "token" parameter. | is included using the "token" parameter. | |||
| For example, the client makes the following HTTPS request: | For example, the client makes the following HTTPS request: | |||
| GET /resource HTTP/1.1 | GET /resource HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Authorization: Token token="vF9dft4qmT" | Authorization: Token token="vF9dft4qmT" | |||
| The resource server MUST validate the access token and ensure it has | The resource server MUST validate the access token and ensure it has | |||
| not expired and that its scope covers the requested resource. If the | not expired and that its scope covers the requested resource. If the | |||
| token expired or is invalid, the resource server MUST reply with an | token expired or is invalid, the resource server MUST reply with an | |||
| HTTP 401 status code (Unauthorized) and include the HTTP | HTTP 401 status code (Unauthorized) and include the HTTP | |||
| "WWW-Authenticate" response header as described in Section 6.1. | "WWW-Authenticate" response header as described in Section 8.1. | |||
| For example: | For example: | |||
| HTTP/1.1 401 Unauthorized | HTTP/1.1 401 Unauthorized | |||
| WWW-Authenticate: Token realm='Service', error='token_expired' | WWW-Authenticate: Token realm='Service', error='token_expired' | |||
| Alternatively, the client MAY include the access token using the HTTP | Alternatively, the client MAY include the access token using the HTTP | |||
| request URI in the query component as described in Section 5.2.1, or | request URI in the query component as described in Section 7.2.1, or | |||
| in the HTTP body when using the "application/x-www-form-urlencoded" | in the HTTP body when using the "application/x-www-form-urlencoded" | |||
| content type as described in Section 5.2.2. Clients SHOULD only use | content type as described in Section 7.2.2. Clients SHOULD only use | |||
| the request URI or body when the "Authorization" request header is | the request URI or body when the "Authorization" request header is | |||
| not available, and MUST NOT use more than one method in each request. | not available, and MUST NOT use more than one method in each request. | |||
| 5.2.1. URI Query Parameter | 7.2.1. 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 HTTPS request: | |||
| 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 | The resource server MUST validate the access token and ensure it has | |||
| not expired and its scope includes the requested resource. If the | not expired and its scope includes the requested resource. If the | |||
| resource expired or is not valid, the resource server MUST reply with | resource expired or is not valid, the resource server MUST reply with | |||
| an HTTP 401 status code (Unauthorized) and include the HTTP | an HTTP 401 status code (Unauthorized) and include the HTTP | |||
| "WWW-Authenticate" response header as described in Section 6.1. | "WWW-Authenticate" response header as described in Section 8.1. | |||
| 5.2.2. Form-Encoded Body Parameter | 7.2.2. 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 41, line 48 ¶ | skipping to change at page 42, line 35 ¶ | |||
| 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 | The resource server MUST validate the access token and ensure it has | |||
| not expired and its scope includes the requested resource. If the | not expired and its scope includes the requested resource. If the | |||
| resource expired or is not valid, the resource server MUST reply with | resource expired or is not valid, the resource server MUST reply with | |||
| an HTTP 401 status code (Unauthorized) and include the HTTP | an HTTP 401 status code (Unauthorized) and include the HTTP | |||
| "WWW-Authenticate" response header as described in Section 6.1. | "WWW-Authenticate" response header as described in Section 8.1. | |||
| 5.3. Cryptographic Tokens Requests | 7.3. Cryptographic Tokens Requests | |||
| Clients make authenticated protected resource requests using an | Clients make authenticated protected resource requests using an | |||
| access token with a matching secret by calculating a set of values | access token with a matching secret by calculating a set of values | |||
| and including them in the request using the "Authorization" header | and including them in the request using the "Authorization" header | |||
| field. The way clients calculate these values depends on the access | field. The way clients calculate these values depends on the access | |||
| token secret type as issued by the authorization server. | token secret type as issued by the authorization server. | |||
| This specification defines the "hmac-sha256" algorithm, and | This specification defines the "hmac-sha256" algorithm, and | |||
| establishes a registry for providing additional algorithms. Clients | establishes a registry for providing additional algorithms. Clients | |||
| obtain an access token with a matching "hmac-sha256" secret by using | obtain an access token with a matching "hmac-sha256" secret by using | |||
| the "token_type" parameter when requesting an access token. | the "token_type" parameter when requesting an access token. | |||
| 5.3.1. The 'hmac-sha256' Algorithm | 7.3.1. The 'hmac-sha256' Algorithm | |||
| The "hmac-sha256" algorithm uses the HMAC method as defined in | The "hmac-sha256" algorithm uses the HMAC method as defined in | |||
| [RFC2104] together with the SHA-256 hash function defined in [NIST | [RFC2104] together with the SHA-256 hash function defined in [NIST | |||
| FIPS-180-3] to apply the access token secret to the request and | FIPS-180-3] to apply the access token secret to the request and | |||
| generate a signature value that is included in the request instead of | generate a signature value that is included in the request instead of | |||
| transmitting the secret in the clear. | transmitting the secret in the clear. | |||
| To use the "hmac-sha256" algorithm, clients: | To use the "hmac-sha256" algorithm, clients: | |||
| 1. Calculate the request timestamp and generate a request nonce as | 1. Calculate the request timestamp and generate a request nonce as | |||
| described in Section 5.3.1.1. | described in Section 7.3.1.1. | |||
| 2. Construct the normalized request string as described in | 2. Construct the normalized request string as described in | |||
| Section 5.3.1.2. | Section 7.3.1.2. | |||
| 3. Calculate the request signature as described in Section 5.3.1.3. | 3. Calculate the request signature as described in Section 7.3.1.3. | |||
| 4. Include the timestamp, nonce, algorithm name, and calculated | 4. Include the timestamp, nonce, algorithm name, and calculated | |||
| signature in the request using the "Authorization" header field. | signature in the request using the "Authorization" header field. | |||
| For example: | For example: | |||
| GET /resource HTTP/1.1 | GET /resource HTTP/1.1 | |||
| Host: server.example.com | Host: server.example.com | |||
| Authorization: Token token="vF9dft4qmT", | Authorization: Token token="vF9dft4qmT", | |||
| nonce="s8djwd", | nonce="s8djwd", | |||
| skipping to change at page 43, line 8 ¶ | skipping to change at page 43, line 43 ¶ | |||
| algorithm="hmac-sha256", | algorithm="hmac-sha256", | |||
| signature="wOJIO9A2W5mFwDgiDvZbTSMK/PY=" | signature="wOJIO9A2W5mFwDgiDvZbTSMK/PY=" | |||
| The resource server MUST validate the access token and ensure it has | The resource server MUST validate the access token and ensure it has | |||
| not expired and that its scope covers the requested resource. The | not expired and that its scope covers the requested resource. The | |||
| resource server MUST also recalculate the request signature using the | resource server MUST also recalculate the request signature using the | |||
| attributes provided by the client and compare it to the signature | attributes provided by the client and compare it to the signature | |||
| provided. If the token expired or is invalid, or if the signature is | provided. If the token expired or is invalid, or if the signature is | |||
| incorrect, the resource server MUST reply with an HTTP 401 status | incorrect, the resource server MUST reply with an HTTP 401 status | |||
| code (Unauthorized) and include the HTTP "WWW-Authenticate" response | code (Unauthorized) and include the HTTP "WWW-Authenticate" response | |||
| header as described in Section 6.1. | header as described in Section 8.1. | |||
| For example: | For example: | |||
| HTTP/1.1 401 Unauthorized | HTTP/1.1 401 Unauthorized | |||
| Date: Tue, 15 Nov 2010 08:12:31 GMT | Date: Tue, 15 Nov 2010 08:12:31 GMT | |||
| WWW-Authenticate: Token realm='Service', | WWW-Authenticate: Token realm='Service', | |||
| algorithms='hmac-sha256', | algorithms='hmac-sha256', | |||
| error='invalid_signature' | error='invalid_signature' | |||
| [[ Errors list ]] | [[ Errors list ]] | |||
| 5.3.1.1. Nonce and Timestamp | 7.3.1.1. Nonce and Timestamp | |||
| A timestamp in combination with unique nonce values is used to | A timestamp in combination with unique nonce values is used to | |||
| protect against replay attacks when transmitted over an insecure | protect against replay attacks when transmitted over an insecure | |||
| channel. | channel. | |||
| The nonce is a random string, uniquely generated by the client to | The nonce is a random string, uniquely generated by the client to | |||
| allow the resource server to verify that a request has never been | allow the resource server to verify that a request has never been | |||
| made before and helps prevent replay attacks when requests are made | made before and helps prevent replay attacks when requests are made | |||
| over a non-secure channel. The nonce value MUST be unique across all | over a non-secure channel. The nonce value MUST be unique across all | |||
| requests with the same timestamp and token combinations. | requests with the same timestamp and token combinations. | |||
| skipping to change at page 43, line 43 ¶ | skipping to change at page 44, line 38 ¶ | |||
| seconds since January 1, 1970 00:00:00 GMT, and MUST be a positive | seconds since January 1, 1970 00:00:00 GMT, and MUST be a positive | |||
| integer. | integer. | |||
| To avoid the need to retain an infinite number of nonce values for | To avoid the need to retain an infinite number of nonce values for | |||
| future checks, resource servers MAY choose to restrict the time | future checks, resource servers MAY choose to restrict the time | |||
| period after which a request with an old timestamp is rejected. When | period after which a request with an old timestamp is rejected. When | |||
| resource servers apply such a restriction, clients SHOULD synchronize | resource servers apply such a restriction, clients SHOULD synchronize | |||
| their clocks by using the resource server's time as indicated by the | their clocks by using the resource server's time as indicated by the | |||
| HTTP "Date" response header field as defined in [RFC2616]. | HTTP "Date" response header field as defined in [RFC2616]. | |||
| 5.3.1.2. Normalized String Construction | 7.3.1.2. Normalized String Construction | |||
| The normalized request string is a consistent, reproducible | The normalized request string is a consistent, reproducible | |||
| concatenation of several of the HTTP request elements into a single | concatenation of several of the HTTP request elements into a single | |||
| string. The string is used as an input to the selected cryptographic | string. The string is used as an input to the selected cryptographic | |||
| method and includes the HTTP request method (e.g. "GET", "POST", | method and includes the HTTP request method (e.g. "GET", "POST", | |||
| etc.), the authority as declared by the HTTP "Host" request header, | etc.), the authority as declared by the HTTP "Host" request header, | |||
| and the request resource URI. | and the request resource URI. | |||
| The normalized request string does not cover the entire HTTP request. | The normalized request string does not cover the entire HTTP request. | |||
| Most notably, it does not include the entity-body or most HTTP | Most notably, it does not include the entity-body or most HTTP | |||
| entity-headers. It is important to note that the resource server | entity-headers. It is important to note that the resource server | |||
| cannot verify the authenticity of the excluded request elements | cannot verify the authenticity of the excluded request elements | |||
| without using additional protections such as TLS/SSL. | without using additional protections such as TLS/SSL. | |||
| The normalized request string is constructed by concatenating | The normalized request string is constructed by concatenating | |||
| together, in order, the following HTTP request elements, separated by | together, in order, the following HTTP request elements, separated by | |||
| the "," character (ASCII code 44): | the "," character (ASCII code 44): | |||
| 1. The request timestamp as described in Section 5.3.1.1. | 1. The request timestamp as described in Section 7.3.1.1. | |||
| 2. The request nonce as described in Section 5.3.1.1. | 2. The request nonce as described in Section 7.3.1.1. | |||
| 3. The cryptographic algorithm used. | 3. The cryptographic algorithm used. | |||
| 4. The HTTP request method in uppercase. For example: "HEAD", | 4. The HTTP request method in uppercase. For example: "HEAD", | |||
| "GET", "POST", etc. | "GET", "POST", etc. | |||
| 5. The hostname, colon-separated (ASCII code 58) from the TCP port | 5. The hostname, colon-separated (ASCII code 58) from the TCP port | |||
| used to make the request as included in the HTTP request "Host" | used to make the request as included in the HTTP request "Host" | |||
| header field. The port MUST be included even if it is not | header field. The port MUST be included even if it is not | |||
| included in the "Host" header field (i.e. the default port for | included in the "Host" header field (i.e. the default port for | |||
| skipping to change at page 44, line 40 ¶ | skipping to change at page 45, line 35 ¶ | |||
| 6. The request resource URI. | 6. The request resource URI. | |||
| For example, the normalized request string for the "GET" request URI | For example, the normalized request string for the "GET" request URI | |||
| "http://example.com/resource", request timestamp "137131200", request | "http://example.com/resource", request timestamp "137131200", request | |||
| nonce "s8djwd", and "hmac-sha256" algorithm (line breaks are for | nonce "s8djwd", and "hmac-sha256" algorithm (line breaks are for | |||
| display purposes only): | display purposes only): | |||
| 137131200,s8djwd,hmac-sha256,GET,example.com:80, | 137131200,s8djwd,hmac-sha256,GET,example.com:80, | |||
| http://example.com/resource | http://example.com/resource | |||
| 5.3.1.3. Signature Calculation | 7.3.1.3. Signature Calculation | |||
| Clients calculate the request signature using the HMAC-SHA256 | Clients calculate the request signature using the HMAC-SHA256 | |||
| function: | function: | |||
| digest = HMAC-SHA256 (key, text) | digest = HMAC-SHA256 (key, text) | |||
| by setting the function variables are follows: | by setting the function variables are follows: | |||
| text | text | |||
| is set to the value of the normalize request string as | is set to the value of the normalize request string as | |||
| described in Section 5.3.1.2. | described in Section 7.3.1.2. | |||
| key | key | |||
| is set to the access token secret. | is set to the access token secret. | |||
| The request signature is the calculated value of the "digest" | The request signature is the calculated value of the "digest" | |||
| variable after the result octet string is base64-encoded per | variable after the result octet string is base64-encoded per | |||
| [RFC2045] section 6.8. | [RFC2045] section 6.8. | |||
| 6. Identifying a Protected Resource | 8. Identifying a Protected Resource | |||
| Clients access protected resources after locating the appropriate | Clients access protected resources after locating the appropriate | |||
| authorization and token endpoints and obtaining an access token. In | authorization and token endpoints and obtaining an access token. In | |||
| many cases, interacting with a protected resource requires prior | many cases, interacting with a protected resource requires prior | |||
| knowledge of the protected resource properties and methods, as well | knowledge of the protected resource properties and methods, as well | |||
| as its authentication requirements (i.e. establishing client | as its authentication requirements (i.e. establishing client | |||
| identity, locating the authorization and token endpoints). | identity, locating the authorization and token endpoints). | |||
| However, there are cases in which clients are unfamiliar with the | However, there are cases in which clients are unfamiliar with the | |||
| protected resource, including whether the resource requires | protected resource, including whether the resource requires | |||
| authentication. When clients attempt to access an unfamiliar | authentication. When clients attempt to access an unfamiliar | |||
| protected resource without an access token, the resource server | protected resource without an access token, the resource server | |||
| denies the request and informs the client of the required credentials | denies the request and informs the client of the required credentials | |||
| using an HTTP authentication challenge. | using an HTTP authentication challenge. | |||
| In addition, when receiving an invalid authenticated request, the | In addition, when receiving an invalid authenticated request, the | |||
| resource server issues an authentication challenge including the | resource server issues an authentication challenge including the | |||
| error type and message. | error type and message. | |||
| 6.1. The WWW-Authenticate Response Header | 8.1. The WWW-Authenticate Response Header | |||
| A resource server receiving a request for a protected resource | A resource server receiving a request for a protected resource | |||
| without a valid access token MUST respond with a 401 HTTP status code | without a valid access token MUST respond with a 401 HTTP status code | |||
| (Unauthorized), and includes at least one "Token" "WWW-Authenticate" | (Unauthorized), and includes at least one "Token" "WWW-Authenticate" | |||
| response header field challenge. | response header field challenge. | |||
| The "WWW-Authenticate" header field uses the framework defined by | The "WWW-Authenticate" header field uses the framework defined by | |||
| [RFC2617] as follows: | [RFC2617] as follows: | |||
| challenge = "Token" RWS token-challenge | challenge = "Token" RWS token-challenge | |||
| skipping to change at page 46, line 20 ¶ | skipping to change at page 47, line 20 ¶ | |||
| [ CS algorithms ] | [ CS algorithms ] | |||
| [ CS error ] | [ CS error ] | |||
| authz-uri = "auth-uri" "=" URI-Reference | authz-uri = "auth-uri" "=" URI-Reference | |||
| token-uri = "token-uri" "=" URI-Reference | token-uri = "token-uri" "=" URI-Reference | |||
| algorithms = "algorithms" "=" <"> 1#algorithm-name <"> | algorithms = "algorithms" "=" <"> 1#algorithm-name <"> | |||
| error = "error" "=" <"> token <"> | error = "error" "=" <"> token <"> | |||
| CS = OWS "," OWS | CS = OWS "," OWS | |||
| 6.1.1. The 'realm' Attribute | 8.1.1. The 'realm' Attribute | |||
| 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]. | |||
| 6.1.2. The 'authorization-uri' Attribute | 8.1.2. The 'authorization-uri' Attribute | |||
| 6.1.3. The 'algorithms' Attribute | 8.1.3. The 'algorithms' Attribute | |||
| 6.1.4. The 'error' Attribute | 8.1.4. The 'error' Attribute | |||
| 7. Security Considerations | 9. Security Considerations | |||
| [[ Todo ]] | [[ Todo ]] | |||
| 8. IANA Considerations | 10. IANA Considerations | |||
| [[ Not Yet ]] | [[ Not Yet ]] | |||
| 9. Acknowledgements | 11. Acknowledgements | |||
| [[ Add OAuth 1.0a authors + WG contributors ]] | [[ Add OAuth 1.0a authors + WG contributors ]] | |||
| Appendix A. Differences from OAuth 1.0a | Appendix A. Differences from OAuth 1.0a | |||
| [[ Todo ]] | [[ Todo ]] | |||
| Appendix B. Document History | Appendix B. Document History | |||
| [[ to be removed by RFC editor before publication as an RFC ]] | [[ to be removed by RFC editor before publication as an RFC ]] | |||
| -02 | ||||
| o Removed restriction on "redirect_uri" including a query. | ||||
| o Added "scope" parameter. | ||||
| o Initial proposal for a JSON-based token response format. | ||||
| -01 | -01 | |||
| o Editorial changes based on feedback from Brian Eaton, Bill Keenan, | o Editorial changes based on feedback from Brian Eaton, Bill Keenan, | |||
| and Chuck Mortimore. | and Chuck Mortimore. | |||
| o Changed devide flow "type" parameter values and switch to use only | o Changed devide flow "type" parameter values and switch to use only | |||
| the token endpoint. | the token endpoint. | |||
| -00 | -00 | |||
| o Initial draft based on a combination of WRAP and OAuth 1.0a. | o Initial draft based on a combination of WRAP and OAuth 1.0a. | |||
| 10. References | 12. References | |||
| 10.1. Normative References | 12.1. Normative References | |||
| [I-D.ietf-httpbis-p1-messaging] | [I-D.ietf-httpbis-p1-messaging] | |||
| Fielding, R., Gettys, J., Mogul, J., Nielsen, H., | Fielding, R., Gettys, J., Mogul, J., Nielsen, H., | |||
| Masinter, L., Leach, P., Berners-Lee, T., and J. Reschke, | Masinter, L., Leach, P., Berners-Lee, T., and J. Reschke, | |||
| "HTTP/1.1, part 1: URIs, Connections, and Message | "HTTP/1.1, part 1: URIs, Connections, and Message | |||
| Parsing", draft-ietf-httpbis-p1-messaging-09 (work in | Parsing", draft-ietf-httpbis-p1-messaging-09 (work in | |||
| progress), March 2010. | progress), March 2010. | |||
| [NIST FIPS-180-3] | [NIST FIPS-180-3] | |||
| National Institute of Standards and Technology, "Secure | National Institute of Standards and Technology, "Secure | |||
| skipping to change at page 48, line 21 ¶ | skipping to change at page 49, line 30 ¶ | |||
| Standards (PKCS) #1: RSA Cryptography Specifications | Standards (PKCS) #1: RSA Cryptography Specifications | |||
| Version 2.1", RFC 3447, February 2003. | Version 2.1", RFC 3447, February 2003. | |||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
| 10646", STD 63, RFC 3629, November 2003. | 10646", STD 63, RFC 3629, November 2003. | |||
| [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 | ||||
| JavaScript Object Notation (JSON)", RFC 4627, July 2006. | ||||
| [W3C.REC-html40-19980424] | [W3C.REC-html40-19980424] | |||
| Hors, A., Jacobs, I., and D. Raggett, "HTML 4.0 | Hors, A., Raggett, D., and I. Jacobs, "HTML 4.0 | |||
| Specification", World Wide Web Consortium | Specification", World Wide Web Consortium | |||
| Recommendation REC-html40-19980424, April 1998, | Recommendation REC-html40-19980424, April 1998, | |||
| <http://www.w3.org/TR/1998/REC-html40-19980424>. | <http://www.w3.org/TR/1998/REC-html40-19980424>. | |||
| 10.2. Informative References | 12.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. | |||
| [I-D.hardt-oauth] | [I-D.hardt-oauth] | |||
| Hardt, D., Tom, A., Eaton, B., and Y. Goland, "OAuth Web | Hardt, D., Tom, A., Eaton, B., and Y. Goland, "OAuth Web | |||
| Resource Authorization Profiles", draft-hardt-oauth-01 | Resource Authorization Profiles", draft-hardt-oauth-01 | |||
| (work in progress), January 2010. | (work in progress), January 2010. | |||
| skipping to change at page 49, line 4 ¶ | skipping to change at page 50, line 13 ¶ | |||
| "Assertions and Protocol for the OASIS Security Assertion | "Assertions and Protocol for the OASIS Security Assertion | |||
| Markup Language (SAML) V2.0", OASIS Standard saml-core- | Markup Language (SAML) V2.0", OASIS Standard saml-core- | |||
| 2.0-os, March 2005. | 2.0-os, March 2005. | |||
| Authors' Addresses | Authors' Addresses | |||
| Eran Hammer-Lahav (editor) | Eran Hammer-Lahav (editor) | |||
| Yahoo! | Yahoo! | |||
| Email: eran@hueniverse.com | Email: eran@hueniverse.com | |||
| URI: http://hueniverse.com | ||||
| David Recordon | David Recordon | |||
| Email: davidrecordon@facebook.com | Email: davidrecordon@facebook.com | |||
| URI: http://www.davidrecordon.com/ | URI: http://www.davidrecordon.com/ | |||
| Dick Hardt | Dick Hardt | |||
| Email: dick.hardt@gmail.com | Email: dick.hardt@gmail.com | |||
| URI: http://dickhardt.org/ | URI: http://dickhardt.org/ | |||
| End of changes. 150 change blocks. | ||||
| 329 lines changed or deleted | 353 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/ | ||||