1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131 |
- Internet Engineering Task Force (IETF) E. Hammer-Lahav, Ed.
- Request for Comments: 5849 April 2010
- Category: Informational
- ISSN: 2070-1721
- The OAuth 1.0 Protocol
- Abstract
- OAuth provides a method for clients to access server resources on
- behalf of a resource owner (such as a different client or an end-
- user). It also provides a process for end-users to authorize third-
- party access to their server resources without sharing their
- credentials (typically, a username and password pair), using user-
- agent redirections.
- Status of This Memo
- This document is not an Internet Standards Track specification; it is
- published for informational purposes.
- This document is a product of the Internet Engineering Task Force
- (IETF). It represents the consensus of the IETF community. It has
- received public review and has been approved for publication by the
- Internet Engineering Steering Group (IESG). Not all documents
- approved by the IESG are a candidate for any level of Internet
- Standard; see Section 2 of RFC 5741.
- Information about the current status of this document, any errata,
- and how to provide feedback on it may be obtained at
- http://www.rfc-editor.org/info/rfc5849.
- Copyright Notice
- Copyright (c) 2010 IETF Trust and the persons identified as the
- document authors. All rights reserved.
- This document is subject to BCP 78 and the IETF Trust's Legal
- Provisions Relating to IETF Documents
- (http://trustee.ietf.org/license-info) in effect on the date of
- publication of this document. Please review these documents
- carefully, as they describe your rights and restrictions with respect
- to this document. Code Components extracted from this document must
- include Simplified BSD License text as described in Section 4.e of
- the Trust Legal Provisions and are provided without warranty as
- described in the Simplified BSD License.
- Hammer-Lahav Informational [Page 1]
- RFC 5849 OAuth 1.0 April 2010
- Table of Contents
- 1. Introduction ....................................................3
- 1.1. Terminology ................................................4
- 1.2. Example ....................................................5
- 1.3. Notational Conventions .....................................7
- 2. Redirection-Based Authorization .................................8
- 2.1. Temporary Credentials ......................................9
- 2.2. Resource Owner Authorization ..............................10
- 2.3. Token Credentials .........................................12
- 3. Authenticated Requests .........................................14
- 3.1. Making Requests ...........................................14
- 3.2. Verifying Requests ........................................16
- 3.3. Nonce and Timestamp .......................................17
- 3.4. Signature .................................................18
- 3.4.1. Signature Base String ..............................18
- 3.4.2. HMAC-SHA1 ..........................................25
- 3.4.3. RSA-SHA1 ...........................................25
- 3.4.4. PLAINTEXT ..........................................26
- 3.5. Parameter Transmission ....................................26
- 3.5.1. Authorization Header ...............................27
- 3.5.2. Form-Encoded Body ..................................28
- 3.5.3. Request URI Query ..................................28
- 3.6. Percent Encoding ..........................................29
- 4. Security Considerations ........................................29
- 4.1. RSA-SHA1 Signature Method .................................29
- 4.2. Confidentiality of Requests ...............................30
- 4.3. Spoofing by Counterfeit Servers ...........................30
- 4.4. Proxying and Caching of Authenticated Content .............30
- 4.5. Plaintext Storage of Credentials ..........................30
- 4.6. Secrecy of the Client Credentials .........................31
- 4.7. Phishing Attacks ..........................................31
- 4.8. Scoping of Access Requests ................................31
- 4.9. Entropy of Secrets ........................................32
- 4.10. Denial-of-Service / Resource-Exhaustion Attacks ..........32
- 4.11. SHA-1 Cryptographic Attacks ..............................33
- 4.12. Signature Base String Limitations ........................33
- 4.13. Cross-Site Request Forgery (CSRF) ........................33
- 4.14. User Interface Redress ...................................34
- 4.15. Automatic Processing of Repeat Authorizations ............34
- 5. Acknowledgments ................................................35
- Appendix A. Differences from the Community Edition ...............36
- 6. References .....................................................37
- 6.1. Normative References ......................................37
- 6.2. Informative References ....................................38
- Hammer-Lahav Informational [Page 2]
- RFC 5849 OAuth 1.0 April 2010
- 1. Introduction
- The OAuth protocol was originally created by a small community of web
- developers from a variety of websites and other Internet services who
- wanted to solve the common problem of enabling delegated access to
- protected resources. The resulting OAuth protocol was stabilized at
- version 1.0 in October 2007, and revised in June 2009 (Revision A) as
- published at <http://oauth.net/core/1.0a>.
- This specification provides an informational documentation of OAuth
- Core 1.0 Revision A, addresses several errata reported since that
- time, and makes numerous editorial clarifications. While this
- specification is not an item of the IETF's OAuth Working Group, which
- at the time of writing is working on an OAuth version that can be
- appropriate for publication on the standards track, it has been
- transferred to the IETF for change control by authors of the original
- work.
- In the traditional client-server authentication model, the client
- uses its credentials to access its resources hosted by the server.
- With the increasing use of distributed web services and cloud
- computing, third-party applications require access to these server-
- hosted resources.
- OAuth introduces a third role to the traditional client-server
- authentication model: the resource owner. In the OAuth model, the
- client (which is not the resource owner, but is acting on its behalf)
- requests access to resources controlled by the resource owner, but
- hosted by the server. In addition, OAuth allows the server to verify
- not only the resource owner authorization, but also the identity of
- the client making the request.
- OAuth provides a method for clients to access server resources on
- behalf of a resource owner (such as a different client or an end-
- user). It also provides a process for end-users to authorize third-
- party access to their server resources without sharing their
- credentials (typically, a username and password pair), using user-
- agent redirections.
- For example, a web user (resource owner) can grant a printing service
- (client) access to her private photos stored at a photo sharing
- service (server), without sharing her username and password with the
- printing service. Instead, she authenticates directly with the photo
- sharing service which issues the printing service delegation-specific
- credentials.
- Hammer-Lahav Informational [Page 3]
- RFC 5849 OAuth 1.0 April 2010
- In order for the client to access resources, it first has to obtain
- permission from the resource owner. This permission is expressed in
- the form of a token and matching shared-secret. The purpose of the
- token is to make it unnecessary for the resource owner to share its
- credentials with the client. Unlike the resource owner credentials,
- tokens can be issued with a restricted scope and limited lifetime,
- and revoked independently.
- This specification consists of two parts. The first part defines a
- redirection-based user-agent process for end-users to authorize
- client access to their resources, by authenticating directly with the
- server and provisioning tokens to the client for use with the
- authentication method. The second part defines a method for making
- authenticated HTTP [RFC2616] requests using two sets of credentials,
- one identifying the client making the request, and a second
- identifying the resource owner on whose behalf the request is being
- made.
- The use of OAuth with any transport protocol other than [RFC2616] is
- undefined.
- 1.1. Terminology
- client
- An HTTP client (per [RFC2616]) capable of making OAuth-
- authenticated requests (Section 3).
- server
- An HTTP server (per [RFC2616]) capable of accepting OAuth-
- authenticated requests (Section 3).
- protected resource
- An access-restricted resource that can be obtained from the
- server using an OAuth-authenticated request (Section 3).
- resource owner
- An entity capable of accessing and controlling protected
- resources by using credentials to authenticate with the server.
- credentials
- Credentials are a pair of a unique identifier and a matching
- shared secret. OAuth defines three classes of credentials:
- client, temporary, and token, used to identify and authenticate
- the client making the request, the authorization request, and
- the access grant, respectively.
- Hammer-Lahav Informational [Page 4]
- RFC 5849 OAuth 1.0 April 2010
- token
- A unique identifier issued by the server and used by the client
- to associate authenticated requests with the resource owner
- whose authorization is requested or has been obtained by the
- client. Tokens have a matching shared-secret that is used by
- the client to establish its ownership of the token, and its
- authority to represent the resource owner.
- The original community specification used a somewhat different
- terminology that maps to this specifications as follows (original
- community terms provided on left):
- Consumer: client
- Service Provider: server
- User: resource owner
- Consumer Key and Secret: client credentials
- Request Token and Secret: temporary credentials
- Access Token and Secret: token credentials
- 1.2. Example
- Jane (resource owner) has recently uploaded some private vacation
- photos (protected resources) to her photo sharing site
- 'photos.example.net' (server). She would like to use the
- 'printer.example.com' website (client) to print one of these photos.
- Typically, Jane signs into 'photos.example.net' using her username
- and password.
- However, Jane does not wish to share her username and password with
- the 'printer.example.com' website, which needs to access the photo in
- order to print it. In order to provide its users with better
- service, 'printer.example.com' has signed up for a set of
- 'photos.example.net' client credentials ahead of time:
- Client Identifier
- dpf43f3p2l4k3l03
- Client Shared-Secret:
- kd94hf93k423kf44
- The 'printer.example.com' website has also configured its application
- to use the protocol endpoints listed in the 'photos.example.net' API
- documentation, which use the "HMAC-SHA1" signature method:
- Hammer-Lahav Informational [Page 5]
- RFC 5849 OAuth 1.0 April 2010
- Temporary Credential Request
- https://photos.example.net/initiate
- Resource Owner Authorization URI:
- https://photos.example.net/authorize
- Token Request URI:
- https://photos.example.net/token
- Before 'printer.example.com' can ask Jane to grant it access to the
- photos, it must first establish a set of temporary credentials with
- 'photos.example.net' to identify the delegation request. To do so,
- the client sends the following HTTPS [RFC2818] request to the server:
- POST /initiate HTTP/1.1
- Host: photos.example.net
- Authorization: OAuth realm="Photos",
- oauth_consumer_key="dpf43f3p2l4k3l03",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131200",
- oauth_nonce="wIjqoS",
- oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready",
- oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"
- The server validates the request and replies with a set of temporary
- credentials in the body of the HTTP response (line breaks are for
- display purposes only):
- HTTP/1.1 200 OK
- Content-Type: application/x-www-form-urlencoded
- oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03&
- oauth_callback_confirmed=true
- The client redirects Jane's user-agent to the server's Resource Owner
- Authorization endpoint to obtain Jane's approval for accessing her
- private photos:
- https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola
- The server requests Jane to sign in using her username and password
- and if successful, asks her to approve granting 'printer.example.com'
- access to her private photos. Jane approves the request and her
- user-agent is redirected to the callback URI provided by the client
- in the previous request (line breaks are for display purposes only):
- http://printer.example.com/ready?
- oauth_token=hh5s93j4hdidpola&oauth_verifier=hfdp7dh39dks9884
- Hammer-Lahav Informational [Page 6]
- RFC 5849 OAuth 1.0 April 2010
- The callback request informs the client that Jane completed the
- authorization process. The client then requests a set of token
- credentials using its temporary credentials (over a secure Transport
- Layer Security (TLS) channel):
- POST /token HTTP/1.1
- Host: photos.example.net
- Authorization: OAuth realm="Photos",
- oauth_consumer_key="dpf43f3p2l4k3l03",
- oauth_token="hh5s93j4hdidpola",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131201",
- oauth_nonce="walatlh",
- oauth_verifier="hfdp7dh39dks9884",
- oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D"
- The server validates the request and replies with a set of token
- credentials in the body of the HTTP response:
- HTTP/1.1 200 OK
- Content-Type: application/x-www-form-urlencoded
- oauth_token=nnch734d00sl2jdk&oauth_token_secret=pfkkdhi9sl3r4s00
- With a set of token credentials, the client is now ready to request
- the private photo:
- GET /photos?file=vacation.jpg&size=original HTTP/1.1
- Host: photos.example.net
- Authorization: OAuth realm="Photos",
- oauth_consumer_key="dpf43f3p2l4k3l03",
- oauth_token="nnch734d00sl2jdk",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131202",
- oauth_nonce="chapoH",
- oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D"
- The 'photos.example.net' server validates the request and responds
- with the requested photo. 'printer.example.com' is able to continue
- accessing Jane's private photos using the same set of token
- credentials for the duration of Jane's authorization, or until Jane
- revokes access.
- 1.3. Notational Conventions
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in [RFC2119].
- Hammer-Lahav Informational [Page 7]
- RFC 5849 OAuth 1.0 April 2010
- 2. Redirection-Based Authorization
- OAuth uses tokens to represent the authorization granted to the
- client by the resource owner. Typically, token credentials are
- issued by the server at the resource owner's request, after
- authenticating the resource owner's identity (usually using a
- username and password).
- There are many ways in which a server can facilitate the provisioning
- of token credentials. This section defines one such way, using HTTP
- redirections and the resource owner's user-agent. This redirection-
- based authorization method includes three steps:
- 1. The client obtains a set of temporary credentials from the server
- (in the form of an identifier and shared-secret). The temporary
- credentials are used to identify the access request throughout
- the authorization process.
- 2. The resource owner authorizes the server to grant the client's
- access request (identified by the temporary credentials).
- 3. The client uses the temporary credentials to request a set of
- token credentials from the server, which will enable it to access
- the resource owner's protected resources.
- The server MUST revoke the temporary credentials after being used
- once to obtain the token credentials. It is RECOMMENDED that the
- temporary credentials have a limited lifetime. Servers SHOULD enable
- resource owners to revoke token credentials after they have been
- issued to clients.
- In order for the client to perform these steps, the server needs to
- advertise the URIs of the following three endpoints:
- Temporary Credential Request
- The endpoint used by the client to obtain a set of temporary
- credentials as described in Section 2.1.
- Resource Owner Authorization
- The endpoint to which the resource owner is redirected to grant
- authorization as described in Section 2.2.
- Token Request
- The endpoint used by the client to request a set of token
- credentials using the set of temporary credentials as described
- in Section 2.3.
- Hammer-Lahav Informational [Page 8]
- RFC 5849 OAuth 1.0 April 2010
- The three URIs advertised by the server MAY include a query component
- as defined by [RFC3986], Section 3, but if present, the query MUST
- NOT contain any parameters beginning with the "oauth_" prefix, to
- avoid conflicts with the protocol parameters added to the URIs when
- used.
- The methods in which the server advertises and documents its three
- endpoints are beyond the scope of this specification. Clients should
- avoid making assumptions about the size of tokens and other server-
- generated values, which are left undefined by this specification. In
- addition, protocol parameters MAY include values that require
- encoding when transmitted. Clients and servers should not make
- assumptions about the possible range of their values.
- 2.1. Temporary Credentials
- The client obtains a set of temporary credentials from the server by
- making an authenticated (Section 3) HTTP "POST" request to the
- Temporary Credential Request endpoint (unless the server advertises
- another HTTP request method for the client to use). The client
- constructs a request URI by adding the following REQUIRED parameter
- to the request (in addition to the other protocol parameters, using
- the same parameter transmission method):
- oauth_callback: An absolute URI back to which the server will
- redirect the resource owner when the Resource Owner
- Authorization step (Section 2.2) is completed. If
- the client is unable to receive callbacks or a
- callback URI has been established via other means,
- the parameter value MUST be set to "oob" (case
- sensitive), to indicate an out-of-band
- configuration.
- Servers MAY specify additional parameters.
- When making the request, the client authenticates using only the
- client credentials. The client MAY omit the empty "oauth_token"
- protocol parameter from the request and MUST use the empty string as
- the token secret value.
- Since the request results in the transmission of plain text
- credentials in the HTTP response, the server MUST require the use of
- a transport-layer mechanisms such as TLS or Secure Socket Layer (SSL)
- (or a secure channel with equivalent protections).
- Hammer-Lahav Informational [Page 9]
- RFC 5849 OAuth 1.0 April 2010
- For example, the client makes the following HTTPS request:
- POST /request_temp_credentials HTTP/1.1
- Host: server.example.com
- Authorization: OAuth realm="Example",
- oauth_consumer_key="jd83jd92dhsh93js",
- oauth_signature_method="PLAINTEXT",
- oauth_callback="http%3A%2F%2Fclient.example.net%2Fcb%3Fx%3D1",
- oauth_signature="ja893SD9%26"
- The server MUST verify (Section 3.2) the request and if valid,
- respond back to the client with a set of temporary credentials (in
- the form of an identifier and shared-secret). The temporary
- credentials are included 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 REQUIRED parameters:
- oauth_token
- The temporary credentials identifier.
- oauth_token_secret
- The temporary credentials shared-secret.
- oauth_callback_confirmed
- MUST be present and set to "true". The parameter is used to
- differentiate from previous versions of the protocol.
- Note that even though the parameter names include the term 'token',
- these credentials are not token credentials, but are used in the next
- two steps in a similar manner to token credentials.
- For example (line breaks are for display purposes only):
- HTTP/1.1 200 OK
- Content-Type: application/x-www-form-urlencoded
- oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&
- oauth_callback_confirmed=true
- 2.2. Resource Owner Authorization
- Before the client requests a set of token credentials from the
- server, it MUST send the user to the server to authorize the request.
- The client constructs a request URI by adding the following REQUIRED
- query parameter to the Resource Owner Authorization endpoint URI:
- Hammer-Lahav Informational [Page 10]
- RFC 5849 OAuth 1.0 April 2010
- oauth_token
- The temporary credentials identifier obtained in Section 2.1 in
- the "oauth_token" parameter. Servers MAY declare this
- parameter as OPTIONAL, in which case they MUST provide a way
- for the resource owner to indicate the identifier through other
- means.
- Servers MAY specify additional parameters.
- The client directs the resource owner to the constructed URI using an
- HTTP redirection response, or by other means available to it via the
- resource owner's user-agent. The request MUST use the HTTP "GET"
- method.
- For example, the client redirects the resource owner's user-agent to
- make the following HTTPS request:
- GET /authorize_access?oauth_token=hdk48Djdsa HTTP/1.1
- Host: server.example.com
- The way in which the server handles the authorization request,
- including whether it uses a secure channel such as TLS/SSL is beyond
- the scope of this specification. However, the server MUST first
- verify the identity of the resource owner.
- When asking the resource owner to authorize the requested access, the
- server SHOULD present to the resource owner information about the
- client requesting access based on the association of the temporary
- credentials with the client identity. When displaying any such
- information, the server SHOULD indicate if the information has been
- verified.
- After receiving an authorization decision from the resource owner,
- the server redirects the resource owner to the callback URI if one
- was provided in the "oauth_callback" parameter or by other means.
- To make sure that the resource owner granting access is the same
- resource owner returning back to the client to complete the process,
- the server MUST generate a verification code: an unguessable value
- passed to the client via the resource owner and REQUIRED to complete
- the process. The server constructs the request URI by adding the
- following REQUIRED parameters to the callback URI query component:
- oauth_token
- The temporary credentials identifier received from the client.
- Hammer-Lahav Informational [Page 11]
- RFC 5849 OAuth 1.0 April 2010
- oauth_verifier
- The verification code.
- If the callback URI already includes a query component, the server
- MUST append the OAuth parameters to the end of the existing query.
- For example, the server redirects the resource owner's user-agent to
- make the following HTTP request:
- GET /cb?x=1&oauth_token=hdk48Djdsa&oauth_verifier=473f82d3 HTTP/1.1
- Host: client.example.net
- If the client did not provide a callback URI, the server SHOULD
- display the value of the verification code, and instruct the resource
- owner to manually inform the client that authorization is completed.
- If the server knows a client to be running on a limited device, it
- SHOULD ensure that the verifier value is suitable for manual entry.
- 2.3. Token Credentials
- The client obtains a set of token credentials from the server by
- making an authenticated (Section 3) HTTP "POST" request to the Token
- Request endpoint (unless the server advertises another HTTP request
- method for the client to use). The client constructs a request URI
- by adding the following REQUIRED parameter to the request (in
- addition to the other protocol parameters, using the same parameter
- transmission method):
- oauth_verifier
- The verification code received from the server in the previous
- step.
- When making the request, the client authenticates using the client
- credentials as well as the temporary credentials. The temporary
- credentials are used as a substitute for token credentials in the
- authenticated request and transmitted using the "oauth_token"
- parameter.
- Since the request results in the transmission of plain text
- credentials in the HTTP response, the server MUST require the use of
- a transport-layer mechanism such as TLS or SSL (or a secure channel
- with equivalent protections).
- Hammer-Lahav Informational [Page 12]
- RFC 5849 OAuth 1.0 April 2010
- For example, the client makes the following HTTPS request:
- POST /request_token HTTP/1.1
- Host: server.example.com
- Authorization: OAuth realm="Example",
- oauth_consumer_key="jd83jd92dhsh93js",
- oauth_token="hdk48Djdsa",
- oauth_signature_method="PLAINTEXT",
- oauth_verifier="473f82d3",
- oauth_signature="ja893SD9%26xyz4992k83j47x0b"
- The server MUST verify (Section 3.2) the validity of the request,
- ensure that the resource owner has authorized the provisioning of
- token credentials to the client, and ensure that the temporary
- credentials have not expired or been used before. The server MUST
- also verify the verification code received from the client. If the
- request is valid and authorized, the token credentials are included
- 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 REQUIRED parameters:
- oauth_token
- The token identifier.
- oauth_token_secret
- The token shared-secret.
- For example:
- HTTP/1.1 200 OK
- Content-Type: application/x-www-form-urlencoded
- oauth_token=j49ddk933skd9dks&oauth_token_secret=ll399dj47dskfjdk
- The server must retain the scope, duration, and other attributes
- approved by the resource owner, and enforce these restrictions when
- receiving a client request made with the token credentials issued.
- Once the client receives and stores the token credentials, it can
- proceed to access protected resources on behalf of the resource owner
- by making authenticated requests (Section 3) using the client
- credentials together with the token credentials received.
- Hammer-Lahav Informational [Page 13]
- RFC 5849 OAuth 1.0 April 2010
- 3. Authenticated Requests
- The HTTP authentication methods defined by [RFC2617] enable clients
- to make authenticated HTTP requests. Clients using these methods
- gain access to protected resources by using their credentials
- (typically, a username and password pair), which allow the server to
- verify their authenticity. Using these methods for delegation
- requires the client to assume the role of the resource owner.
- OAuth provides a method designed to include two sets of credentials
- with each request, one to identify the client, and another to
- identify the resource owner. Before a client can make authenticated
- requests on behalf of the resource owner, it must obtain a token
- authorized by the resource owner. Section 2 provides one such method
- through which the client can obtain a token authorized by the
- resource owner.
- The client credentials take the form of a unique identifier and an
- associated shared-secret or RSA key pair. Prior to making
- authenticated requests, the client establishes a set of credentials
- with the server. The process and requirements for provisioning these
- are outside the scope of this specification. Implementers are urged
- to consider the security ramifications of using client credentials,
- some of which are described in Section 4.6.
- Making authenticated requests requires prior knowledge of the
- server's configuration. OAuth includes multiple methods for
- transmitting protocol parameters with requests (Section 3.5), as well
- as multiple methods for the client to prove its rightful ownership of
- the credentials used (Section 3.4). The way in which clients
- discover the required configuration is outside the scope of this
- specification.
- 3.1. Making Requests
- An authenticated request includes several protocol parameters. Each
- parameter name begins with the "oauth_" prefix, and the parameter
- names and values are case sensitive. Clients make authenticated
- requests by calculating the values of a set of protocol parameters
- and adding them to the HTTP request as follows:
- 1. The client assigns value to each of these REQUIRED (unless
- specified otherwise) protocol parameters:
- Hammer-Lahav Informational [Page 14]
- RFC 5849 OAuth 1.0 April 2010
- oauth_consumer_key
- The identifier portion of the client credentials (equivalent to
- a username). The parameter name reflects a deprecated term
- (Consumer Key) used in previous revisions of the specification,
- and has been retained to maintain backward compatibility.
- oauth_token
- The token value used to associate the request with the resource
- owner. If the request is not associated with a resource owner
- (no token available), clients MAY omit the parameter.
- oauth_signature_method
- The name of the signature method used by the client to sign the
- request, as defined in Section 3.4.
- oauth_timestamp
- The timestamp value as defined in Section 3.3. The parameter
- MAY be omitted when using the "PLAINTEXT" signature method.
- oauth_nonce
- The nonce value as defined in Section 3.3. The parameter MAY
- be omitted when using the "PLAINTEXT" signature method.
- oauth_version
- OPTIONAL. If present, MUST be set to "1.0". Provides the
- version of the authentication process as defined in this
- specification.
- 2. The protocol parameters are added to the request using one of the
- transmission methods listed in Section 3.5. Each parameter MUST
- NOT appear more than once per request.
- 3. The client calculates and assigns the value of the
- "oauth_signature" parameter as described in Section 3.4 and adds
- the parameter to the request using the same method as in the
- previous step.
- 4. The client sends the authenticated HTTP request to the server.
- For example, to make the following HTTP request authenticated (the
- "c2&a3=2+q" string in the following examples is used to illustrate
- the impact of a form-encoded entity-body):
- POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
- Host: example.com
- Content-Type: application/x-www-form-urlencoded
- c2&a3=2+q
- Hammer-Lahav Informational [Page 15]
- RFC 5849 OAuth 1.0 April 2010
- The client assigns values to the following protocol parameters using
- its client credentials, token credentials, the current timestamp, a
- uniquely generated nonce, and indicates that it will use the
- "HMAC-SHA1" signature method:
- oauth_consumer_key: 9djdj82h48djs9d2
- oauth_token: kkk9d7dh3k39sjv7
- oauth_signature_method: HMAC-SHA1
- oauth_timestamp: 137131201
- oauth_nonce: 7d8f3e4a
- The client adds the protocol parameters to the request using the
- OAuth HTTP "Authorization" header field:
- Authorization: OAuth realm="Example",
- oauth_consumer_key="9djdj82h48djs9d2",
- oauth_token="kkk9d7dh3k39sjv7",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131201",
- oauth_nonce="7d8f3e4a"
- Then, it calculates the value of the "oauth_signature" parameter
- (using client secret "j49sk3j29djd" and token secret "dh893hdasih9"),
- adds it to the request, and sends the HTTP request to the server:
- POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
- Host: example.com
- Content-Type: application/x-www-form-urlencoded
- Authorization: OAuth realm="Example",
- oauth_consumer_key="9djdj82h48djs9d2",
- oauth_token="kkk9d7dh3k39sjv7",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131201",
- oauth_nonce="7d8f3e4a",
- oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
- c2&a3=2+q
- 3.2. Verifying Requests
- Servers receiving an authenticated request MUST validate it by:
- o Recalculating the request signature independently as described in
- Section 3.4 and comparing it to the value received from the client
- via the "oauth_signature" parameter.
- Hammer-Lahav Informational [Page 16]
- RFC 5849 OAuth 1.0 April 2010
- o If using the "HMAC-SHA1" or "RSA-SHA1" signature methods, ensuring
- that the combination of nonce/timestamp/token (if present)
- received from the client has not been used before in a previous
- request (the server MAY reject requests with stale timestamps as
- described in Section 3.3).
- o If a token is present, verifying the scope and status of the
- client authorization as represented by the token (the server MAY
- choose to restrict token usage to the client to which it was
- issued).
- o If the "oauth_version" parameter is present, ensuring its value is
- "1.0".
- If the request fails verification, the server SHOULD respond with the
- appropriate HTTP response status code. The server MAY include
- further details about why the request was rejected in the response
- body.
- The server SHOULD return a 400 (Bad Request) status code when
- receiving a request with unsupported parameters, an unsupported
- signature method, missing parameters, or duplicated protocol
- parameters. The server SHOULD return a 401 (Unauthorized) status
- code when receiving a request with invalid client credentials, an
- invalid or expired token, an invalid signature, or an invalid or used
- nonce.
- 3.3. Nonce and Timestamp
- The timestamp value MUST be a positive integer. Unless otherwise
- specified by the server's documentation, the timestamp is expressed
- in the number of seconds since January 1, 1970 00:00:00 GMT.
- A nonce is a random string, uniquely generated by the client to allow
- the server to verify that a request has never been made before and
- helps prevent replay attacks when requests are made over a non-secure
- channel. The nonce value MUST be unique across all requests with the
- same timestamp, client credentials, and token combinations.
- To avoid the need to retain an infinite number of nonce values for
- future checks, servers MAY choose to restrict the time period after
- which a request with an old timestamp is rejected. Note that this
- restriction implies a level of synchronization between the client's
- and server's clocks. Servers applying such a restriction MAY provide
- a way for the client to sync with the server's clock; alternatively,
- both systems could synchronize with a trusted time service. Details
- of clock synchronization strategies are beyond the scope of this
- specification.
- Hammer-Lahav Informational [Page 17]
- RFC 5849 OAuth 1.0 April 2010
- 3.4. Signature
- OAuth-authenticated requests can have two sets of credentials: those
- passed via the "oauth_consumer_key" parameter and those in the
- "oauth_token" parameter. In order for the server to verify the
- authenticity of the request and prevent unauthorized access, the
- client needs to prove that it is the rightful owner of the
- credentials. This is accomplished using the shared-secret (or RSA
- key) part of each set of credentials.
- OAuth provides three methods for the client to prove its rightful
- ownership of the credentials: "HMAC-SHA1", "RSA-SHA1", and
- "PLAINTEXT". These methods are generally referred to as signature
- methods, even though "PLAINTEXT" does not involve a signature. In
- addition, "RSA-SHA1" utilizes an RSA key instead of the shared-
- secrets associated with the client credentials.
- OAuth does not mandate a particular signature method, as each
- implementation can have its own unique requirements. Servers are
- free to implement and document their own custom methods.
- Recommending any particular method is beyond the scope of this
- specification. Implementers should review the Security
- Considerations section (Section 4) before deciding on which method to
- support.
- The client declares which signature method is used via the
- "oauth_signature_method" parameter. It then generates a signature
- (or a string of an equivalent value) and includes it in the
- "oauth_signature" parameter. The server verifies the signature as
- specified for each method.
- The signature process does not change the request or its parameters,
- with the exception of the "oauth_signature" parameter.
- 3.4.1. Signature Base String
- The signature base string is a consistent, reproducible concatenation
- of several of the HTTP request elements into a single string. The
- string is used as an input to the "HMAC-SHA1" and "RSA-SHA1"
- signature methods.
- The signature base string includes the following components of the
- HTTP request:
- o The HTTP request method (e.g., "GET", "POST", etc.).
- o The authority as declared by the HTTP "Host" request header field.
- Hammer-Lahav Informational [Page 18]
- RFC 5849 OAuth 1.0 April 2010
- o The path and query components of the request resource URI.
- o The protocol parameters excluding the "oauth_signature".
- o Parameters included in the request entity-body if they comply with
- the strict restrictions defined in Section 3.4.1.3.
- The signature base string does not cover the entire HTTP request.
- Most notably, it does not include the entity-body in most requests,
- nor does it include most HTTP entity-headers. It is important to
- note that the server cannot verify the authenticity of the excluded
- request components without using additional protections such as SSL/
- TLS or other methods.
- 3.4.1.1. String Construction
- The signature base string is constructed by concatenating together,
- in order, the following HTTP request elements:
- 1. The HTTP request method in uppercase. For example: "HEAD",
- "GET", "POST", etc. If the request uses a custom HTTP method, it
- MUST be encoded (Section 3.6).
- 2. An "&" character (ASCII code 38).
- 3. The base string URI from Section 3.4.1.2, after being encoded
- (Section 3.6).
- 4. An "&" character (ASCII code 38).
- 5. The request parameters as normalized in Section 3.4.1.3.2, after
- being encoded (Section 3.6).
- For example, the HTTP request:
- POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
- Host: example.com
- Content-Type: application/x-www-form-urlencoded
- Authorization: OAuth realm="Example",
- oauth_consumer_key="9djdj82h48djs9d2",
- oauth_token="kkk9d7dh3k39sjv7",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131201",
- oauth_nonce="7d8f3e4a",
- oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
- c2&a3=2+q
- Hammer-Lahav Informational [Page 19]
- RFC 5849 OAuth 1.0 April 2010
- is represented by the following signature base string (line breaks
- are for display purposes only):
- POST&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q
- %26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_
- key%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_m
- ethod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk
- 9d7dh3k39sjv7
- 3.4.1.2. Base String URI
- The scheme, authority, and path of the request resource URI [RFC3986]
- are included by constructing an "http" or "https" URI representing
- the request resource (without the query or fragment) as follows:
- 1. The scheme and host MUST be in lowercase.
- 2. The host and port values MUST match the content of the HTTP
- request "Host" header field.
- 3. The port MUST be included if it is not the default port for the
- scheme, and MUST be excluded if it is the default. Specifically,
- the port MUST be excluded when making an HTTP request [RFC2616]
- to port 80 or when making an HTTPS request [RFC2818] to port 443.
- All other non-default port numbers MUST be included.
- For example, the HTTP request:
- GET /r%20v/X?id=123 HTTP/1.1
- Host: EXAMPLE.COM:80
- is represented by the base string URI: "http://example.com/r%20v/X".
- In another example, the HTTPS request:
- GET /?q=1 HTTP/1.1
- Host: www.example.net:8080
- is represented by the base string URI:
- "https://www.example.net:8080/".
- 3.4.1.3. Request Parameters
- In order to guarantee a consistent and reproducible representation of
- the request parameters, the parameters are collected and decoded to
- their original decoded form. They are then sorted and encoded in a
- particular manner that is often different from their original
- encoding scheme, and concatenated into a single string.
- Hammer-Lahav Informational [Page 20]
- RFC 5849 OAuth 1.0 April 2010
- 3.4.1.3.1. Parameter Sources
- The parameters from the following sources are collected into a single
- list of name/value pairs:
- o The query component of the HTTP request URI as defined by
- [RFC3986], Section 3.4. The query component is parsed into a list
- of name/value pairs by treating it as an
- "application/x-www-form-urlencoded" string, separating the names
- and values and decoding them as defined by
- [W3C.REC-html40-19980424], Section 17.13.4.
- o The OAuth HTTP "Authorization" header field (Section 3.5.1) if
- present. The header's content is parsed into a list of name/value
- pairs excluding the "realm" parameter if present. The parameter
- values are decoded as defined by Section 3.5.1.
- o The HTTP request entity-body, but only if all of the following
- conditions are met:
- * The entity-body is single-part.
- * The entity-body follows the encoding requirements of the
- "application/x-www-form-urlencoded" content-type as defined by
- [W3C.REC-html40-19980424].
- * The HTTP request entity-header includes the "Content-Type"
- header field set to "application/x-www-form-urlencoded".
- The entity-body is parsed into a list of decoded name/value pairs
- as described in [W3C.REC-html40-19980424], Section 17.13.4.
- The "oauth_signature" parameter MUST be excluded from the signature
- base string if present. Parameters not explicitly included in the
- request MUST be excluded from the signature base string (e.g., the
- "oauth_version" parameter when omitted).
- Hammer-Lahav Informational [Page 21]
- RFC 5849 OAuth 1.0 April 2010
- For example, the HTTP request:
- POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
- Host: example.com
- Content-Type: application/x-www-form-urlencoded
- Authorization: OAuth realm="Example",
- oauth_consumer_key="9djdj82h48djs9d2",
- oauth_token="kkk9d7dh3k39sjv7",
- oauth_signature_method="HMAC-SHA1",
- oauth_timestamp="137131201",
- oauth_nonce="7d8f3e4a",
- oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"
- c2&a3=2+q
- contains the following (fully decoded) parameters used in the
- signature base sting:
- +------------------------+------------------+
- | Name | Value |
- +------------------------+------------------+
- | b5 | =%3D |
- | a3 | a |
- | c@ | |
- | a2 | r b |
- | oauth_consumer_key | 9djdj82h48djs9d2 |
- | oauth_token | kkk9d7dh3k39sjv7 |
- | oauth_signature_method | HMAC-SHA1 |
- | oauth_timestamp | 137131201 |
- | oauth_nonce | 7d8f3e4a |
- | c2 | |
- | a3 | 2 q |
- +------------------------+------------------+
- Note that the value of "b5" is "=%3D" and not "==". Both "c@" and
- "c2" have empty values. While the encoding rules specified in this
- specification for the purpose of constructing the signature base
- string exclude the use of a "+" character (ASCII code 43) to
- represent an encoded space character (ASCII code 32), this practice
- is widely used in "application/x-www-form-urlencoded" encoded values,
- and MUST be properly decoded, as demonstrated by one of the "a3"
- parameter instances (the "a3" parameter is used twice in this
- request).
- Hammer-Lahav Informational [Page 22]
- RFC 5849 OAuth 1.0 April 2010
- 3.4.1.3.2. Parameters Normalization
- The parameters collected in Section 3.4.1.3 are normalized into a
- single string as follows:
- 1. First, the name and value of each parameter are encoded
- (Section 3.6).
- 2. The parameters are sorted by name, using ascending byte value
- ordering. If two or more parameters share the same name, they
- are sorted by their value.
- 3. The name of each parameter is concatenated to its corresponding
- value using an "=" character (ASCII code 61) as a separator, even
- if the value is empty.
- 4. The sorted name/value pairs are concatenated together into a
- single string by using an "&" character (ASCII code 38) as
- separator.
- For example, the list of parameters from the previous section would
- be normalized as follows:
- Encoded:
- +------------------------+------------------+
- | Name | Value |
- +------------------------+------------------+
- | b5 | %3D%253D |
- | a3 | a |
- | c%40 | |
- | a2 | r%20b |
- | oauth_consumer_key | 9djdj82h48djs9d2 |
- | oauth_token | kkk9d7dh3k39sjv7 |
- | oauth_signature_method | HMAC-SHA1 |
- | oauth_timestamp | 137131201 |
- | oauth_nonce | 7d8f3e4a |
- | c2 | |
- | a3 | 2%20q |
- +------------------------+------------------+
- Hammer-Lahav Informational [Page 23]
- RFC 5849 OAuth 1.0 April 2010
- Sorted:
- +------------------------+------------------+
- | Name | Value |
- +------------------------+------------------+
- | a2 | r%20b |
- | a3 | 2%20q |
- | a3 | a |
- | b5 | %3D%253D |
- | c%40 | |
- | c2 | |
- | oauth_consumer_key | 9djdj82h48djs9d2 |
- | oauth_nonce | 7d8f3e4a |
- | oauth_signature_method | HMAC-SHA1 |
- | oauth_timestamp | 137131201 |
- | oauth_token | kkk9d7dh3k39sjv7 |
- +------------------------+------------------+
- Concatenated Pairs:
- +-------------------------------------+
- | Name=Value |
- +-------------------------------------+
- | a2=r%20b |
- | a3=2%20q |
- | a3=a |
- | b5=%3D%253D |
- | c%40= |
- | c2= |
- | oauth_consumer_key=9djdj82h48djs9d2 |
- | oauth_nonce=7d8f3e4a |
- | oauth_signature_method=HMAC-SHA1 |
- | oauth_timestamp=137131201 |
- | oauth_token=kkk9d7dh3k39sjv7 |
- +-------------------------------------+
- and concatenated together into a single string (line breaks are for
- display purposes only):
- a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9dj
- dj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1
- &oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7
- Hammer-Lahav Informational [Page 24]
- RFC 5849 OAuth 1.0 April 2010
- 3.4.2. HMAC-SHA1
- The "HMAC-SHA1" signature method uses the HMAC-SHA1 signature
- algorithm as defined in [RFC2104]:
- digest = HMAC-SHA1 (key, text)
- The HMAC-SHA1 function variables are used in following way:
- text is set to the value of the signature base string from
- Section 3.4.1.1.
- key is set to the concatenated values of:
- 1. The client shared-secret, after being encoded
- (Section 3.6).
- 2. An "&" character (ASCII code 38), which MUST be included
- even when either secret is empty.
- 3. The token shared-secret, after being encoded
- (Section 3.6).
- digest is used to set the value of the "oauth_signature" protocol
- parameter, after the result octet string is base64-encoded
- per [RFC2045], Section 6.8.
- 3.4.3. RSA-SHA1
- The "RSA-SHA1" signature method uses the RSASSA-PKCS1-v1_5 signature
- algorithm as defined in [RFC3447], Section 8.2 (also known as
- PKCS#1), using SHA-1 as the hash function for EMSA-PKCS1-v1_5. To
- use this method, the client MUST have established client credentials
- with the server that included its RSA public key (in a manner that is
- beyond the scope of this specification).
- The signature base string is signed using the client's RSA private
- key per [RFC3447], Section 8.2.1:
- S = RSASSA-PKCS1-V1_5-SIGN (K, M)
- Where:
- K is set to the client's RSA private key,
- M is set to the value of the signature base string from
- Section 3.4.1.1, and
- Hammer-Lahav Informational [Page 25]
- RFC 5849 OAuth 1.0 April 2010
- S is the result signature used to set the value of the
- "oauth_signature" protocol parameter, after the result octet
- string is base64-encoded per [RFC2045] section 6.8.
- The server verifies the signature per [RFC3447] section 8.2.2:
- RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S)
- Where:
- (n, e) is set to the client's RSA public key,
- M is set to the value of the signature base string from
- Section 3.4.1.1, and
- S is set to the octet string value of the "oauth_signature"
- protocol parameter received from the client.
- 3.4.4. PLAINTEXT
- The "PLAINTEXT" method does not employ a signature algorithm. It
- MUST be used with a transport-layer mechanism such as TLS or SSL (or
- sent over a secure channel with equivalent protections). It does not
- utilize the signature base string or the "oauth_timestamp" and
- "oauth_nonce" parameters.
- The "oauth_signature" protocol parameter is set to the concatenated
- value of:
- 1. The client shared-secret, after being encoded (Section 3.6).
- 2. An "&" character (ASCII code 38), which MUST be included even
- when either secret is empty.
- 3. The token shared-secret, after being encoded (Section 3.6).
- 3.5. Parameter Transmission
- When making an OAuth-authenticated request, protocol parameters as
- well as any other parameter using the "oauth_" prefix SHALL be
- included in the request using one and only one of the following
- locations, listed in order of decreasing preference:
- 1. The HTTP "Authorization" header field as described in
- Section 3.5.1.
- 2. The HTTP request entity-body as described in Section 3.5.2.
- Hammer-Lahav Informational [Page 26]
- RFC 5849 OAuth 1.0 April 2010
- 3. The HTTP request URI query as described in Section 3.5.3.
- In addition to these three methods, future extensions MAY define
- other methods for including protocol parameters in the request.
- 3.5.1. Authorization Header
- Protocol parameters can be transmitted using the HTTP "Authorization"
- header field as defined by [RFC2617] with the auth-scheme name set to
- "OAuth" (case insensitive).
- For example:
- Authorization: OAuth realm="Example",
- oauth_consumer_key="0685bd9184jfhq22",
- oauth_token="ad180jjd733klru7",
- oauth_signature_method="HMAC-SHA1",
- oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
- oauth_timestamp="137131200",
- oauth_nonce="4572616e48616d6d65724c61686176",
- oauth_version="1.0"
- Protocol parameters SHALL be included in the "Authorization" header
- field as follows:
- 1. Parameter names and values are encoded per Parameter Encoding
- (Section 3.6).
- 2. Each parameter's name is immediately followed by an "=" character
- (ASCII code 61), a """ character (ASCII code 34), the parameter
- value (MAY be empty), and another """ character (ASCII code 34).
- 3. Parameters are separated by a "," character (ASCII code 44) and
- OPTIONAL linear whitespace per [RFC2617].
- 4. The OPTIONAL "realm" parameter MAY be added and interpreted per
- [RFC2617] section 1.2.
- Servers MAY indicate their support for the "OAuth" auth-scheme by
- returning the HTTP "WWW-Authenticate" response header field upon
- client requests for protected resources. As per [RFC2617], such a
- response MAY include additional HTTP "WWW-Authenticate" header
- fields:
- For example:
- WWW-Authenticate: OAuth realm="http://server.example.com/"
- Hammer-Lahav Informational [Page 27]
- RFC 5849 OAuth 1.0 April 2010
- The realm parameter defines a protection realm per [RFC2617], Section
- 1.2.
- 3.5.2. Form-Encoded Body
- Protocol parameters can be transmitted in the HTTP request entity-
- body, but only if the following REQUIRED conditions are met:
- o The entity-body is single-part.
- o The entity-body follows the encoding requirements of the
- "application/x-www-form-urlencoded" content-type as defined by
- [W3C.REC-html40-19980424].
- o The HTTP request entity-header includes the "Content-Type" header
- field set to "application/x-www-form-urlencoded".
- For example (line breaks are for display purposes only):
- oauth_consumer_key=0685bd9184jfhq22&oauth_token=ad180jjd733klr
- u7&oauth_signature_method=HMAC-SHA1&oauth_signature=wOJIO9A2W5
- mFwDgiDvZbTSMK%2FPY%3D&oauth_timestamp=137131200&oauth_nonce=4
- 572616e48616d6d65724c61686176&oauth_version=1.0
- The entity-body MAY include other request-specific parameters, in
- which case, the protocol parameters SHOULD be appended following the
- request-specific parameters, properly separated by an "&" character
- (ASCII code 38).
- 3.5.3. Request URI Query
- Protocol parameters can be transmitted by being added to the HTTP
- request URI as a query parameter as defined by [RFC3986], Section 3.
- For example (line breaks are for display purposes only):
- GET /example/path?oauth_consumer_key=0685bd9184jfhq22&
- oauth_token=ad180jjd733klru7&oauth_signature_method=HM
- AC-SHA1&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%
- 3D&oauth_timestamp=137131200&oauth_nonce=4572616e48616
- d6d65724c61686176&oauth_version=1.0 HTTP/1.1
- The request URI MAY include other request-specific query parameters,
- in which case, the protocol parameters SHOULD be appended following
- the request-specific parameters, properly separated by an "&"
- character (ASCII code 38).
- Hammer-Lahav Informational [Page 28]
- RFC 5849 OAuth 1.0 April 2010
- 3.6. Percent Encoding
- Existing percent-encoding methods do not guarantee a consistent
- construction of the signature base string. The following percent-
- encoding method is not defined to replace the existing encoding
- methods defined by [RFC3986] and [W3C.REC-html40-19980424]. It is
- used only in the construction of the signature base string and the
- "Authorization" header field.
- This specification defines the following method for percent-encoding
- strings:
- 1. Text values are first encoded as UTF-8 octets per [RFC3629] if
- they are not already. This does not include binary values that
- are not intended for human consumption.
- 2. The values are then escaped using the [RFC3986] percent-encoding
- (%XX) mechanism as follows:
- * Characters in the unreserved character set as defined by
- [RFC3986], Section 2.3 (ALPHA, DIGIT, "-", ".", "_", "~") MUST
- NOT be encoded.
- * All other characters MUST be encoded.
- * The two hexadecimal characters used to represent encoded
- characters MUST be uppercase.
- This method is different from the encoding scheme used by the
- "application/x-www-form-urlencoded" content-type (for example, it
- encodes space characters as "%20" and not using the "+" character).
- It MAY be different from the percent-encoding functions provided by
- web-development frameworks (e.g., encode different characters, use
- lowercase hexadecimal characters).
- 4. Security Considerations
- As stated in [RFC2617], the greatest sources of risks are usually
- found not in the core protocol itself but in policies and procedures
- surrounding its use. Implementers are strongly encouraged to assess
- how this protocol addresses their security requirements.
- 4.1. RSA-SHA1 Signature Method
- Authenticated requests made with "RSA-SHA1" signatures do not use the
- token shared-secret, or any provisioned client shared-secret. This
- means the request relies completely on the secrecy of the private key
- used by the client to sign requests.
- Hammer-Lahav Informational [Page 29]
- RFC 5849 OAuth 1.0 April 2010
- 4.2. Confidentiality of Requests
- While this protocol provides a mechanism for verifying the integrity
- of requests, it provides no guarantee of request confidentiality.
- Unless further precautions are taken, eavesdroppers will have full
- access to request content. Servers should carefully consider the
- kinds of data likely to be sent as part of such requests, and should
- employ transport-layer security mechanisms to protect sensitive
- resources.
- 4.3. Spoofing by Counterfeit Servers
- This protocol makes no attempt to verify the authenticity of the
- server. A hostile party could take advantage of this by intercepting
- the client's requests and returning misleading or otherwise incorrect
- responses. Service providers should consider such attacks when
- developing services using this protocol, and should require
- transport-layer security for any requests where the authenticity of
- the server or of request responses is an issue.
- 4.4. Proxying and Caching of Authenticated Content
- The HTTP Authorization scheme (Section 3.5.1) is optional. However,
- [RFC2616] relies on the "Authorization" and "WWW-Authenticate" header
- fields to distinguish authenticated content so that it can be
- protected. Proxies and caches, in particular, may fail to adequately
- protect requests not using these header fields.
- For example, private authenticated content may be stored in (and thus
- retrievable from) publicly accessible caches. Servers not using the
- HTTP "Authorization" header field should take care to use other
- mechanisms, such as the "Cache-Control" header field, to ensure that
- authenticated content is protected.
- 4.5. Plaintext Storage of Credentials
- The client shared-secret and token shared-secret function the same
- way passwords do in traditional authentication systems. In order to
- compute the signatures used in methods other than "RSA-SHA1", the
- server must have access to these secrets in plaintext form. This is
- in contrast, for example, to modern operating systems, which store
- only a one-way hash of user credentials.
- If an attacker were to gain access to these secrets -- or worse, to
- the server's database of all such secrets -- he or she would be able
- to perform any action on behalf of any resource owner. Accordingly,
- it is critical that servers protect these secrets from unauthorized
- access.
- Hammer-Lahav Informational [Page 30]
- RFC 5849 OAuth 1.0 April 2010
- 4.6. Secrecy of the Client Credentials
- In many cases, the client application will be under the control of
- potentially untrusted parties. For example, if the client is a
- desktop application with freely available source code or an
- executable binary, an attacker may be able to download a copy for
- analysis. In such cases, attackers will be able to recover the
- client credentials.
- Accordingly, servers should not use the client credentials alone to
- verify the identity of the client. Where possible, other factors
- such as IP address should be used as well.
- 4.7. Phishing Attacks
- Wide deployment of this and similar protocols may cause resource
- owners to become inured to the practice of being redirected to
- websites where they are asked to enter their passwords. If resource
- owners are not careful to verify the authenticity of these websites
- before entering their credentials, it will be possible for attackers
- to exploit this practice to steal resource owners' passwords.
- Servers should attempt to educate resource owners about the risks
- phishing attacks pose, and should provide mechanisms that make it
- easy for resource owners to confirm the authenticity of their sites.
- Client developers should consider the security implications of how
- they interact with a user-agent (e.g., separate window, embedded),
- and the ability of the end-user to verify the authenticity of the
- server website.
- 4.8. Scoping of Access Requests
- By itself, this protocol does not provide any method for scoping the
- access rights granted to a client. However, most applications do
- require greater granularity of access rights. For example, servers
- may wish to make it possible to grant access to some protected
- resources but not others, or to grant only limited access (such as
- read-only access) to those protected resources.
- When implementing this protocol, servers should consider the types of
- access resource owners may wish to grant clients, and should provide
- mechanisms to do so. Servers should also take care to ensure that
- resource owners understand the access they are granting, as well as
- any risks that may be involved.
- Hammer-Lahav Informational [Page 31]
- RFC 5849 OAuth 1.0 April 2010
- 4.9. Entropy of Secrets
- Unless a transport-layer security protocol is used, eavesdroppers
- will have full access to authenticated requests and signatures, and
- will thus be able to mount offline brute-force attacks to recover the
- credentials used. Servers should be careful to assign shared-secrets
- that are long enough, and random enough, to resist such attacks for
- at least the length of time that the shared-secrets are valid.
- For example, if shared-secrets are valid for two weeks, servers
- should ensure that it is not possible to mount a brute force attack
- that recovers the shared-secret in less than two weeks. Of course,
- servers are urged to err on the side of caution, and use the longest
- secrets reasonable.
- It is equally important that the pseudo-random number generator
- (PRNG) used to generate these secrets be of sufficiently high
- quality. Many PRNG implementations generate number sequences that
- may appear to be random, but that nevertheless exhibit patterns or
- other weaknesses that make cryptanalysis or brute force attacks
- easier. Implementers should be careful to use cryptographically
- secure PRNGs to avoid these problems.
- 4.10. Denial-of-Service / Resource-Exhaustion Attacks
- This specification includes a number of features that may make
- resource exhaustion attacks against servers possible. For example,
- this protocol requires servers to track used nonces. If an attacker
- is able to use many nonces quickly, the resources required to track
- them may exhaust available capacity. And again, this protocol can
- require servers to perform potentially expensive computations in
- order to verify the signature on incoming requests. An attacker may
- exploit this to perform a denial-of-service attack by sending a large
- number of invalid requests to the server.
- Resource Exhaustion attacks are by no means specific to this
- specification. However, implementers should be careful to consider
- the additional avenues of attack that this protocol exposes, and
- design their implementations accordingly. For example, entropy
- starvation typically results in either a complete denial of service
- while the system waits for new entropy or else in weak (easily
- guessable) secrets. When implementing this protocol, servers should
- consider which of these presents a more serious risk for their
- application and design accordingly.
- Hammer-Lahav Informational [Page 32]
- RFC 5849 OAuth 1.0 April 2010
- 4.11. SHA-1 Cryptographic Attacks
- SHA-1, the hash algorithm used in "HMAC-SHA1" and "RSA-SHA1"
- signature methods, has been shown to have a number of cryptographic
- weaknesses that significantly reduce its resistance to collision
- attacks. While these weaknesses do not seem to affect the use of
- SHA-1 with the Hash-based Message Authentication Code (HMAC) and
- should not affect the "HMAC-SHA1" signature method, it may affect the
- use of the "RSA-SHA1" signature method. NIST has announced that it
- will phase out use of SHA-1 in digital signatures by 2010
- [NIST_SHA-1Comments].
- Practically speaking, these weaknesses are difficult to exploit, and
- by themselves do not pose a significant risk to users of this
- protocol. They may, however, make more efficient attacks possible,
- and servers should take this into account when considering whether
- SHA-1 provides an adequate level of security for their applications.
- 4.12. Signature Base String Limitations
- The signature base string has been designed to support the signature
- methods defined in this specification. Those designing additional
- signature methods, should evaluated the compatibility of the
- signature base string with their security requirements.
- Since the signature base string does not cover the entire HTTP
- request, such as most request entity-body, most entity-headers, and
- the order in which parameters are sent, servers should employ
- additional mechanisms to protect such elements.
- 4.13. Cross-Site Request Forgery (CSRF)
- Cross-Site Request Forgery (CSRF) is a web-based attack whereby HTTP
- requests are transmitted from a user that the website trusts or has
- authenticated. CSRF attacks on authorization approvals can allow an
- attacker to obtain authorization to protected resources without the
- consent of the User. Servers SHOULD strongly consider best practices
- in CSRF prevention at all the protocol authorization endpoints.
- CSRF attacks on OAuth callback URIs hosted by clients are also
- possible. Clients should prevent CSRF attacks on OAuth callback URIs
- by verifying that the resource owner at the client site intended to
- complete the OAuth negotiation with the server. The methods for
- preventing such CSRF attacks are beyond the scope of this
- specification.
- Hammer-Lahav Informational [Page 33]
- RFC 5849 OAuth 1.0 April 2010
- 4.14. User Interface Redress
- Servers should protect the authorization process against user
- interface (UI) redress attacks (also known as "clickjacking"). As of
- the time of this writing, no complete defenses against UI redress are
- available. Servers can mitigate the risk of UI redress attacks using
- the following techniques:
- o JavaScript frame busting.
- o JavaScript frame busting, and requiring that browsers have
- JavaScript enabled on the authorization page.
- o Browser-specific anti-framing techniques.
- o Requiring password reentry before issuing OAuth tokens.
- 4.15. Automatic Processing of Repeat Authorizations
- Servers may wish to automatically process authorization requests
- (Section 2.2) from clients that have been previously authorized by
- the resource owner. When the resource owner is redirected to the
- server to grant access, the server detects that the resource owner
- has already granted access to that particular client. Instead of
- prompting the resource owner for approval, the server automatically
- redirects the resource owner back to the client.
- If the client credentials are compromised, automatic processing
- creates additional security risks. An attacker can use the stolen
- client credentials to redirect the resource owner to the server with
- an authorization request. The server will then grant access to the
- resource owner's data without the resource owner's explicit approval,
- or even awareness of an attack. If no automatic approval is
- implemented, an attacker must use social engineering to convince the
- resource owner to approve access.
- Servers can mitigate the risks associated with automatic processing
- by limiting the scope of token credentials obtained through automated
- approvals. Tokens credentials obtained through explicit resource
- owner consent can remain unaffected. Clients can mitigate the risks
- associated with automatic processing by protecting their client
- credentials.
- Hammer-Lahav Informational [Page 34]
- RFC 5849 OAuth 1.0 April 2010
- 5. Acknowledgments
- This specification is directly based on the OAuth Core 1.0 Revision A
- community specification, which in turn was modeled after existing
- proprietary protocols and best practices that have been independently
- implemented by various companies.
- The community specification was edited by Eran Hammer-Lahav and
- authored by: Mark Atwood, Dirk Balfanz, Darren Bounds, Richard M.
- Conlan, Blaine Cook, Leah Culver, Breno de Medeiros, Brian Eaton,
- Kellan Elliott-McCrea, Larry Halff, Eran Hammer-Lahav, Ben Laurie,
- Chris Messina, John Panzer, Sam Quigley, David Recordon, Eran
- Sandler, Jonathan Sergent, Todd Sieling, Brian Slesinsky, and Andy
- Smith.
- The editor would like to thank the following individuals for their
- invaluable contribution to the publication of this edition of the
- protocol: Lisa Dusseault, Justin Hart, Avshalom Houri, Chris Messina,
- Mark Nottingham, Tim Polk, Peter Saint-Andre, Joseph Smarr, and Paul
- Walker.
- Hammer-Lahav Informational [Page 35]
- RFC 5849 OAuth 1.0 April 2010
- Appendix A. Differences from the Community Edition
- This specification includes the following changes made to the
- original community document [OAuthCore1.0_RevisionA] in order to
- correct mistakes and omissions identified since the document was
- originally published at <http://oauth.net>.
- o Changed using TLS/SSL when sending or requesting plain text
- credentials from SHOULD to MUST. This change affects any use of
- the "PLAINTEXT" signature method, as well as requesting temporary
- credentials (Section 2.1) and obtaining token credentials
- (Section 2.3).
- o Adjusted nonce language to indicate it is unique per token/
- timestamp/client combination.
- o Removed the requirement for timestamps to be equal to or greater
- than the timestamp used in the previous request.
- o Changed the nonce and timestamp parameters to OPTIONAL when using
- the "PLAINTEXT" signature method.
- o Extended signature base string coverage that includes
- "application/x-www-form-urlencoded" entity-body parameters when
- the HTTP method used is other than "POST" and URI query parameters
- when the HTTP method used is other than "GET".
- o Incorporated corrections to the instructions in each signature
- method to encode the signature value before inserting it into the
- "oauth_signature" parameter, removing errors that would have
- caused double-encoded values.
- o Allowed omitting the "oauth_token" parameter when empty.
- o Permitted sending requests for temporary credentials with an empty
- "oauth_token" parameter.
- o Removed the restrictions from defining additional "oauth_"
- parameters.
- Hammer-Lahav Informational [Page 36]
- RFC 5849 OAuth 1.0 April 2010
- 6. References
- 6.1. Normative References
- [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, November 1996.
- [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-
- Hashing for Message Authentication", RFC 2104,
- February 1997.
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
- [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
- Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
- Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
- [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
- Leach, P., Luotonen, A., and L. Stewart, "HTTP
- Authentication: Basic and Digest Access Authentication",
- RFC 2617, June 1999.
- [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
- [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography
- Standards (PKCS) #1: RSA Cryptography Specifications
- Version 2.1", RFC 3447, February 2003.
- [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
- 10646", STD 63, RFC 3629, November 2003.
- [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
- Resource Identifier (URI): Generic Syntax", STD 66,
- RFC 3986, January 2005.
- [W3C.REC-html40-19980424]
- Hors, A., Raggett, D., and I. Jacobs, "HTML 4.0
- Specification", World Wide Web Consortium
- Recommendation REC-html40-19980424, April 1998,
- <http://www.w3.org/TR/1998/REC-html40-19980424>.
- Hammer-Lahav Informational [Page 37]
- RFC 5849 OAuth 1.0 April 2010
- 6.2. Informative References
- [NIST_SHA-1Comments]
- Burr, W., "NIST Comments on Cryptanalytic Attacks on
- SHA-1",
- <http://csrc.nist.gov/groups/ST/hash/statement.html>.
- [OAuthCore1.0_RevisionA]
- OAuth Community, "OAuth Core 1.0 Revision A",
- <http://oauth.net/core/1.0a>.
- Author's Address
- Eran Hammer-Lahav (editor)
- EMail: eran@hueniverse.com
- URI: http://hueniverse.com
- Hammer-Lahav Informational [Page 38]
|