从协议入手,剖析OAuth2.0(译 RFC 6749)
1、介紹
? ? ??https://tools.ietf.org/html/rfc6749??
? ? ? 傳統(tǒng)的client-server授權(quán)模型,客戶端通過(guò)使用憑證(通常的用戶名和明文密碼)訪問(wèn)服務(wù)端受保護(hù)的資源,為了能夠讓第三方應(yīng)用程序訪問(wèn)受保護(hù)的資源,需要將憑證共享給第三方。
這就產(chǎn)生了一些問(wèn)題和限制:
- 為了以后能夠持續(xù)訪問(wèn),第三方應(yīng)用程序可能會(huì)存儲(chǔ)憑證(用戶名、密碼)。
- 盡管密碼本身存在安全弱點(diǎn),但服務(wù)器必須支持密碼驗(yàn)證。
- 由于無(wú)法限制受保護(hù)資源的訪問(wèn)粒度和期限,第三方應(yīng)用程序獲得了對(duì)受保護(hù)資源的廣泛訪問(wèn)。
- 除了修改密碼外,無(wú)法對(duì)單個(gè)第三方或者所有第三方吊銷憑證。
? ? OAuth通過(guò)引入一個(gè)授權(quán)層,并分離客戶端和資源擁有者成不同的角色來(lái)解決這個(gè)問(wèn)題。在OAuth中,通過(guò)發(fā)行不同的訪問(wèn)令牌(包括資源訪問(wèn)范圍、生命周期、其他訪問(wèn)屬性),而不是資源本身,來(lái)限制第三方應(yīng)用程序訪問(wèn)受保護(hù)資源(資源擁有者保護(hù)并宿主在資源服務(wù)器)的粒度和期限,而不是直接把憑證(用戶名和密碼)提供給客戶端。
? ? 例如:一個(gè)終端用戶(資源擁有者)可以授權(quán)一個(gè)打印服務(wù)(客戶端)來(lái)訪問(wèn)宿主在圖片共享服務(wù)器(資源服務(wù)器)上的受保護(hù)的圖片(資源),而不用共享憑證(用戶名和密碼)給打印服務(wù)(客戶端)。
1.1 角色
在OAuth中定義了4中角色:
資源所有者(resource owner)
能夠?qū)κ鼙Wo(hù)資源授予訪問(wèn)權(quán)的實(shí)體,當(dāng)資源的所有者是人時(shí),指的就是我們的終端用戶。?
? ? ? ??資源服務(wù)(resource server)
? ? ? ?宿主受保護(hù)的資源。能夠接受和響應(yīng)使用訪問(wèn)令牌(access tokens)對(duì)受保護(hù)資源的請(qǐng)求。
? ? ? ? 客戶端(client)
? ? ? ?對(duì)受保護(hù)資源發(fā)起請(qǐng)求的應(yīng)用程序。可能是一個(gè)服務(wù)、桌面應(yīng)用程序、或者其他設(shè)備。
? ? ? ??授權(quán)服務(wù)(authorization server)
? ? ? ?成功認(rèn)證資源所有者和獲得授權(quán)后,發(fā)行訪問(wèn)令牌給客戶端。
授權(quán)服務(wù)和資源服務(wù)之間的交互不在超過(guò)該規(guī)范,授權(quán)服務(wù)和資源服務(wù)可能是同一個(gè)服務(wù),也可能是不同的服務(wù)。單個(gè)授權(quán)服務(wù)器應(yīng)該可以發(fā)行由多個(gè)資源服務(wù)器接受的訪問(wèn)令牌。
1.2 協(xié)議流程
+--------+ +---------------+| |--(A)- Authorization Request ->| Resource || | | Owner || |<-(B)-- Authorization Grant ---| || | +---------------+| || | +---------------+| |--(C)-- Authorization Grant -->| Authorization || Client | | Server || |<-(D)----- Access Token -------| || | +---------------+| || | +---------------+| |--(E)----- Access Token ------>| Resource || | | Server || |<-(F)--- Protected Resource ---| |+--------+ +---------------+
(A) 客戶端向資源所有者請(qǐng)求授權(quán),這時(shí)授權(quán)請(qǐng)求可能直接提交給資源所有者,也可能提交給授權(quán)服務(wù)(扮演一個(gè)授權(quán)終端)。
(B) 客戶端獲得一個(gè)資源所有者授權(quán)許可的憑證。授權(quán)許可類型可以使用規(guī)范中定義的4中類型,也可以自定類型(注意:授權(quán)服務(wù)需要支持自定義授權(quán)許可類型)。
(C) 客戶端通過(guò)提交授權(quán)許可憑證給授權(quán)服務(wù),請(qǐng)求訪問(wèn)令牌。
(d) 授權(quán)服務(wù)認(rèn)證客戶端并驗(yàn)證授權(quán)許可憑證,頒發(fā)訪問(wèn)令牌。
(E) 客戶端通過(guò)提交已認(rèn)證的訪問(wèn)令牌,請(qǐng)求受保護(hù)的資源。
(F) 資源服務(wù)驗(yàn)證訪問(wèn)令牌,如果有效,響應(yīng)請(qǐng)求。
注意:客戶端獲取獲取授權(quán)許可憑證的首選方法,就是使用授權(quán)服務(wù)作為一個(gè)中介。
1.3 授權(quán)許可
代表資源所有者授權(quán)的一個(gè)憑據(jù),可以用獲取訪問(wèn)令牌;OAuth2.0 協(xié)議定義了4中授權(quán)許可類型:授權(quán)碼模式、隱性模式、資源所有者密碼憑證、客戶端憑證。也可以自定義擴(kuò)展的授權(quán)許可類型。
1.3.1?授權(quán)碼模式(Authorization Code)
? ? ? ? 授權(quán)碼通過(guò)一個(gè)授權(quán)服務(wù)器獲得,授權(quán)服務(wù)在客戶端和資源所有者之間扮演一個(gè)中介。客戶端不是直接從資源所有者請(qǐng)求授權(quán),而是將資源所有者指向授權(quán)服務(wù)器,然后授權(quán)服務(wù)器在將資源所有者引導(dǎo)到客戶端,并攜帶授權(quán)碼。在重定向資源服務(wù)器到客戶端之前,授權(quán)服務(wù)器認(rèn)證資源所有者并獲得授權(quán)。注意授權(quán)服務(wù)器僅僅認(rèn)證資源所有者,并不會(huì)共享憑證給客戶端。
? ? ? ?授權(quán)碼提供了一些重要的安全好處,例如認(rèn)證客戶端,也可以用于直接獲取令牌,而不再需要經(jīng)過(guò)資源所有者,也可以暴露給其他人,包括資源所有者。
1.3.2?隱性模式(Implicit)
? ? ? ?隱性模式是授權(quán)碼模式的簡(jiǎn)化版,使用一個(gè)腳本語(yǔ)言(例如:JavaScript)優(yōu)化了客戶端的實(shí)現(xiàn)。在隱性模式中,資源所有者授權(quán)后,并不會(huì)為客戶端頒發(fā)授權(quán)碼,而是直接頒發(fā)一個(gè)訪問(wèn)令牌。因?yàn)椴](méi)有頒發(fā)中間憑證(例如:授權(quán)碼),授權(quán)許可類型是隱性的,故稱之為隱性模式。
? ? ? ?在隱式授權(quán)流中發(fā)布訪問(wèn)令牌時(shí),授權(quán)服務(wù)器不驗(yàn)證客戶端。在某些情況下,客戶端標(biāo)識(shí)可以通過(guò)傳遞訪問(wèn)令牌給客戶端的重定向URI來(lái)識(shí)別,訪問(wèn)令牌能夠暴露給資源所有者和其他資源所有者訪問(wèn)的應(yīng)用程序。隱性模式提高了某些客戶端的響應(yīng)速度和效率(例如:作為瀏覽器應(yīng)用程序?qū)崿F(xiàn)的客戶端),因?yàn)樗鼫p少了獲取訪問(wèn)令牌所需的往返次數(shù)。但是當(dāng)安全性要求很高的場(chǎng)景下,這種模式需要權(quán)衡,特別是當(dāng)授權(quán)碼模式可用的情況下。
1.3.3?客戶端的驗(yàn)證授權(quán)模式(Resource Owner Password Credentials)
? ? ? ?客戶端的驗(yàn)證授權(quán)(即用戶名和密碼)可以直接作為授權(quán)許可,來(lái)獲得訪問(wèn)令牌。只有當(dāng)資源所有者充分信任(例如:客戶端是整個(gè)系統(tǒng)的一部分,或者是特權(quán)應(yīng)用程序,或者其他授權(quán)許可不可用時(shí))客戶端的情況下,才使用該模式。盡管這種授權(quán)許可類型要求客戶端直接訪問(wèn)資源所有者的憑據(jù),但資源所有者憑證只能用于單個(gè)請(qǐng)求,來(lái)交換訪問(wèn)令牌。通過(guò)使用長(zhǎng)壽命的訪問(wèn)令牌或者刷新令牌,該模式消除了客戶端存儲(chǔ)資源所有者憑證(以備將來(lái)使用)的需求。
1.3.4?客戶端憑證模式(Client Credentials)
? ? ? ?當(dāng)授權(quán)范圍僅限于受客戶端控制的受保護(hù)資源時(shí),客戶端憑據(jù)可以用作授權(quán)許可。通常當(dāng)客戶以自己的名義行事時(shí)(此時(shí),客戶端也是一個(gè)資源所有者),客戶端許可會(huì)被使用。
1.4?訪問(wèn)令牌(Access Token)
? ? ? ?訪問(wèn)令牌是用于訪問(wèn)受保護(hù)資源的憑證。訪問(wèn)令牌是表示向客戶機(jī)頒發(fā)的授權(quán)的字符串,該字符串通常對(duì)客戶端不透明。該令牌帶有特定的范圍(控制資源訪問(wèn)粒度)和持續(xù)時(shí)間,由資源所有者授權(quán)許可,資源服務(wù)器和授權(quán)服務(wù)器強(qiáng)行執(zhí)行。令牌可能表示用于檢索授權(quán)信息的標(biāo)識(shí)符,也可能以可驗(yàn)證方式自包含授權(quán)信息(一個(gè)訪問(wèn)令牌字符串由一些數(shù)據(jù)和一個(gè)簽名信息組成)。
? ? ? ?訪問(wèn)令牌是一個(gè)抽象的層,里面放置著各種各樣資源服務(wù)器能夠理解的構(gòu)造信息(例如:資源的訪問(wèn)范圍、持續(xù)時(shí)間等等)。通過(guò)抽象,也使訪問(wèn)令牌的頒發(fā)不獲得授權(quán)許可更受限制,同時(shí)也消除了資源服務(wù)器需要理解多種認(rèn)證方法的需要。
? ? ? ?基于資源服務(wù)器安全(例如:加密屬性)的需求,訪問(wèn)令牌可能有不同的格式、結(jié)構(gòu)、使用方法。
1.5 刷新令牌(Refresh Token)
? ? ? ??刷新令牌是一個(gè)用于獲取訪問(wèn)令牌的憑證。刷新令牌由授權(quán)服務(wù)器頒發(fā)給客戶端,如果當(dāng)前的訪問(wèn)令牌無(wú)效或者過(guò)期時(shí),獲取一個(gè)新的訪問(wèn)令牌;或者強(qiáng)制再請(qǐng)求一個(gè)訪問(wèn)令牌(可能相同或更窄范圍的訪問(wèn)令牌)。與資源所有者相比,訪問(wèn)令牌有更短的生命周期和更少的權(quán)限。對(duì)于授權(quán)服務(wù)器而言,頒發(fā)一個(gè)刷新令牌是可選的,但是當(dāng)要頒發(fā)刷新令牌時(shí),一般情況下,刷新令牌是伴隨著訪問(wèn)令牌一起頒發(fā)的。
? ? ? ? 刷新令牌代表資源所有者對(duì)客戶端給予授權(quán)許可的字符串,通過(guò)對(duì)客戶端不透明。令牌表示用于檢索授權(quán)信息的標(biāo)識(shí)符。與訪問(wèn)令牌不同,刷新令牌僅用于授權(quán)服務(wù)器,且從不發(fā)送到資源服務(wù)器。
+--------+ +---------------+| |--(A)------- Authorization Grant --------->| || | | || |<-(B)----------- Access Token -------------| || | & Refresh Token | || | | || | +----------+ | || |--(C)---- Access Token ---->| | | || | | | | || |<-(D)- Protected Resource --| Resource | | Authorization || Client | | Server | | Server || |--(E)---- Access Token ---->| | | || | | | | || |<-(F)- Invalid Token Error -| | | || | +----------+ | || | | || |--(G)----------- Refresh Token ----------->| || | | || |<-(H)----------- Access Token -------------| |+--------+ & Optional Refresh Token +---------------+圖 2: 刷新一個(gè)過(guò)期的訪問(wèn)令牌
(A) 客戶端請(qǐng)求授權(quán)服務(wù)器的認(rèn)證,并提交授權(quán)許可。
(B) 授權(quán)服務(wù)器認(rèn)證客戶端并驗(yàn)證授權(quán)許可后,頒發(fā)訪問(wèn)令牌和刷新令牌。
(C) 客戶端向資源服務(wù)器發(fā)出受保護(hù)的資源請(qǐng)求,并提交訪問(wèn)令牌。
(D) 資源服務(wù)器驗(yàn)證訪問(wèn)令牌后,把受保護(hù)的資源響應(yīng)給客戶端。
(E) 步驟(C)和(D)重復(fù),直到訪問(wèn)令牌過(guò)期。如果客戶端知道訪問(wèn)令牌過(guò)期,就會(huì)跳到步驟(G)。否則,它將創(chuàng)建另一個(gè)受保護(hù)的資源請(qǐng)求。
(F) 由于訪問(wèn)令牌無(wú)效,資源服務(wù)器返回一個(gè)無(wú)效的令牌錯(cuò)誤。
(G) 客戶端請(qǐng)求一個(gè)新的訪問(wèn)令牌,并提交刷新令牌。客戶端身份驗(yàn)證需求基于客戶機(jī)類型和授權(quán)服務(wù)器策略。
(H) 授權(quán)服務(wù)器認(rèn)證客戶端并驗(yàn)證刷新令牌后,如果有效,頒發(fā)一個(gè)新的訪問(wèn)令牌(此時(shí),是否頒發(fā)一個(gè)新的刷新令牌是可選的)。
1.6 TLS版本(TLS Version)
? ? ? ?基于廣泛部署和已知的安全漏洞,TLS版本都是隨著時(shí)間變化而變化的。TLS版本1是最廣泛部署的版本,將提供最廣泛的互操作性。具體實(shí)現(xiàn)還可以支持滿足其安全要求的附加傳輸層安全機(jī)制。
1.7 HTTP重定向(HTTP Redirections)
? ? ? ?該規(guī)范充分利用了Http重定向,客戶端和授權(quán)服務(wù)器將資源所有者用戶代理重定向到另外的目的地。雖然規(guī)范中的示例顯示了HTTP 302狀態(tài)代碼的使用,但是允許用戶代理運(yùn)用任何其他方法來(lái)完成此重定向,并被認(rèn)為是實(shí)現(xiàn)細(xì)節(jié)。
1.8?互操作性(Interoperability)
? ? ? ?OAuth 2提供了一個(gè)明確的安全特性豐富的授權(quán)框架。然而,作為一個(gè)豐富且高度可擴(kuò)展的框架,有許多可選組件,這一規(guī)范本身可能會(huì)產(chǎn)生廣泛的非互操作性實(shí)現(xiàn)。此外,該規(guī)范還提供部分必需的部分或完全未定義的組件(例如,客戶端注冊(cè)、授權(quán)服務(wù)器功能、端點(diǎn)發(fā)現(xiàn))。沒(méi)有這些組件,針對(duì)一個(gè)特定的授權(quán)服務(wù)器,資源服務(wù)器的互操作,客戶端必須手動(dòng)配置。這個(gè)框架的設(shè)計(jì)帶有明確的期望,未來(lái)的工作將定義實(shí)現(xiàn)完整Web規(guī)模互操作性所必需的規(guī)范配置文件和擴(kuò)展。
1.9?符號(hào)約定(Notational Conventions)
? ? ? ?該協(xié)議中的關(guān)鍵詞?"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT","SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"在?[RFC2119] 中被詳細(xì)的描述。該規(guī)范使用[RFC5234]中的?the Augmented Backus-Naur Form (ABNF)符號(hào)規(guī)范。此外,規(guī)則的URI引用被包含在“統(tǒng)一資源標(biāo)識(shí)符(URI):通用語(yǔ)法”[ rfc3986 ]中。某些安全相關(guān)的術(shù)語(yǔ)被定義在[RFC4949]中,這些術(shù)語(yǔ)包括但不限于?"attack", "authentication", "authorization", "certificate","confidentiality", "credential", "encryption", "identity", "sign","signature", "trust", "validate", and "verify"。除非另有說(shuō)明,所有協(xié)議參數(shù)名稱和值都是區(qū)分大小寫(xiě)的。
2、客戶端注冊(cè)(Client Registration)
? ? ? ?在啟動(dòng)協(xié)議之前,客戶端使用授權(quán)服務(wù)器進(jìn)行注冊(cè)。客戶端通過(guò)授權(quán)服務(wù)器注冊(cè)的方式超過(guò)了該協(xié)議的范圍,但是一般都是終端用戶通過(guò)一個(gè)HTML表單提交注冊(cè)。客戶端注冊(cè)并不需要客戶端和授權(quán)服務(wù)器的直接交互,只要授權(quán)服務(wù)器支持,可以使用各種各樣的放肆進(jìn)行注冊(cè)并獲取已注冊(cè)客戶端的屬性。例如:可以使用一個(gè)自發(fā)布或者第三方發(fā)布的聲明(assertion)或者授權(quán)服務(wù)器通過(guò)一個(gè)信任的通道來(lái)進(jìn)行客戶端的發(fā)現(xiàn)。
? ? ? ?當(dāng)注冊(cè)一個(gè)客戶端時(shí),客戶端開(kāi)發(fā)人員應(yīng)該:
- 指定客戶端類型
- 提供客戶端重定向的URI
- 包括授權(quán)服務(wù)器所要求的任何其他信息(例如,應(yīng)用程序名稱,網(wǎng)站,描述,Logo圖像,服務(wù)條款等等)。
2.1 客戶端類型(Client Types)
? ? ? ? ? ? ? 基于客戶端和授權(quán)服務(wù)器,安全認(rèn)證的能力(例如:客戶憑證的保密性),OAuth定義了兩種類型的客戶端。
? ? ? ? ? ? ?保密類型(confidential)
? ? ? ? ? ? ?能夠維護(hù)其憑證的保密性的客戶端(例如:客戶端在一個(gè)安全的服務(wù)器上,客戶端的訪問(wèn)受到限制),能夠通過(guò)其他方式來(lái)保證客戶端認(rèn)證的安全性。
? ? ? ? ? ? ?公開(kāi)類型(pulic)
? ? ? ? ? ???不能夠維護(hù)其憑證的保密性的客戶端(例如:在資源所有者的設(shè)備上執(zhí)行客戶端,如已安裝的本機(jī)應(yīng)用程序或基于Web瀏覽器的應(yīng)用程序),不能夠通過(guò)其他方式來(lái)保證客戶端認(rèn)證的安全性。
? ? ? ? ? ? ?客戶機(jī)類型指定是基于授權(quán)服務(wù)器對(duì)安全認(rèn)證的定義及其可接受的客戶端證書(shū)的暴露級(jí)別。授權(quán)服務(wù)器不應(yīng)該對(duì)客戶端類型做出假設(shè)。客戶機(jī)可以實(shí)現(xiàn)為一組分布式組件,每個(gè)組件具有不同的客戶機(jī)類型和安全上下文(例如,一個(gè)分布式客戶端既有基于服務(wù)器的機(jī)密組件,又有基于公共瀏覽器的組件);如果傳統(tǒng)授權(quán)服務(wù)器不能夠?qū)@樣的客戶端提供支持或者注冊(cè)引導(dǎo),客戶應(yīng)將每個(gè)組件注冊(cè)為單獨(dú)的客戶機(jī)。
? ? ? ? ? ? ?本規(guī)范是圍繞以下客戶端配置文件設(shè)計(jì)的:
? ? ? ? ? ? ?web 應(yīng)用程序(web application)
? ? ? ? ? ? ?Web應(yīng)用程序是在Web服務(wù)器上運(yùn)行的機(jī)密客戶端。資源所有者通過(guò)在其使用的設(shè)備上的通過(guò)用戶代理(瀏覽器)中呈現(xiàn)的HTML用戶界面訪問(wèn)客戶端。客戶端憑據(jù)以及向客戶機(jī)發(fā)出的任何訪問(wèn)令牌都存儲(chǔ)在Web服務(wù)器上,不會(huì)被資源所有者暴露或訪問(wèn)。??
? ? ? ? ? ? ?基于用戶代理的應(yīng)用程序(user-agent-based application)
? ? ? ? ? ? ?基于用戶代理的應(yīng)用程序是一個(gè)公共客戶端,其中客戶端代碼從Web服務(wù)器下載并在由資源所有者所使用的設(shè)備的用戶代理內(nèi)執(zhí)行。?所以,對(duì)于資源所有者,協(xié)議數(shù)據(jù)和憑證可以很容易獲得。由于這些應(yīng)用程序駐留在用戶代理中,所以在請(qǐng)求授權(quán)時(shí)可以無(wú)縫地使用用戶代理功能。
? ? ? ? ? ? ?本地應(yīng)用程序(native application)
? ? ? ? ? ? ?本機(jī)應(yīng)用程序是安裝在資源所有者使用的設(shè)備上并執(zhí)行的公共客戶機(jī)。對(duì)于資源所有者,協(xié)議數(shù)據(jù)和證書(shū)是可得到的。假設(shè)可以提取應(yīng)用程序中包含的任何客戶端身份驗(yàn)證憑據(jù)。另一方面,動(dòng)態(tài)發(fā)布的憑據(jù)(如訪問(wèn)令牌或刷新令牌)可以收到可接受的保護(hù)級(jí)別。至少,這些憑據(jù)被保護(hù)免受應(yīng)用程序可能交互的惡意服務(wù)器的保護(hù)。某些情況下,這些應(yīng)用程序也會(huì)受到保護(hù)免受駐留在同一設(shè)備的其他應(yīng)用程序的干擾。
? ? ?2.2 客戶端標(biāo)識(shí)(Client?Identifier)
? ? ? ? ? ?授權(quán)服務(wù)器向注冊(cè)客戶端頒發(fā)客戶端標(biāo)識(shí)符------表示客戶端提供的注冊(cè)信息的唯一字符串。客戶機(jī)標(biāo)識(shí)符不是秘密,它暴露給資源所有者,不能單獨(dú)用于客戶端身份驗(yàn)證。
客戶端標(biāo)識(shí)符對(duì)授權(quán)服務(wù)器是唯一的。
? ? ? ? ? ?客戶標(biāo)識(shí)符字符串大小該規(guī)范未定義。客戶機(jī)應(yīng)該避免對(duì)標(biāo)識(shí)符大小做出假設(shè)。授權(quán)服務(wù)器應(yīng)該記錄它所頒發(fā)的任何標(biāo)識(shí)符的大小。
? ? ?2.3 客戶端認(rèn)證(Client Authentication)
? ? ? ? ? ?如果客戶機(jī)類型是機(jī)密的,客戶機(jī)和授權(quán)服務(wù)器建立適合于授權(quán)服務(wù)器的安全需求的客戶端身份驗(yàn)證方法。授權(quán)服務(wù)器可以接受滿足其安全要求的任何形式的客戶端身份驗(yàn)證。機(jī)密客戶機(jī)通常發(fā)布(或建立)一組客戶端證書(shū),用于與授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證(例如,密碼、公鑰/私鑰對(duì))。授權(quán)服務(wù)器可以和公共客戶端建立客戶端認(rèn)證方法。但是,授權(quán)服務(wù)器不能依賴公共客戶端身份驗(yàn)證,以識(shí)別客戶機(jī)。在每個(gè)請(qǐng)求中,客戶端不能使用多個(gè)身份驗(yàn)證方法。
? ? ? ? ? ? ?2.3.1?客戶端密碼(Client Password)
? ? ? ? ? ? ? ? ? ? ?擁有客戶端密碼的客戶機(jī)可以使用HTTP基本身份驗(yàn)證方案和授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證。客戶端標(biāo)識(shí)使用"application/x-www-form-urlencoded"編碼算法進(jìn)行編碼,編碼值用作用戶名。客戶端密碼使用相同的算法進(jìn)行編碼,并用作密碼。授權(quán)服務(wù)器必須支持HTTP基本身份驗(yàn)證方案,以驗(yàn)證客戶端密碼并頒發(fā)密碼。
? ? ? ? ? ? ? ? ? ? ?例如:授權(quán) Basic?czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3,還有一種可選的方案就是,在請(qǐng)求頭中包含兩個(gè)參數(shù)(client_id和client_secret),這種方案一般不推薦,除非客戶端不能夠使用?HTTP Basic authentication scheme (或者其他的基于密碼的HTTP authentication scheme)。參數(shù)只能在請(qǐng)求體中傳輸,不能包含在請(qǐng)求URI中。
? ? ? ? ? ? ?2.3.1?其他認(rèn)證方法(Other Authentication Methods)
? ? ? ? ? ? ? ? ? ? ?授權(quán)服務(wù)器可以支持符合其安全要求的任何合適的HTTP認(rèn)證方案。在使用其他身份驗(yàn)證方法時(shí),授權(quán)服務(wù)器必須定義客戶端標(biāo)識(shí)符(注冊(cè)記錄)和身份驗(yàn)證方案之間的映射。
? ? ?2.4?未注冊(cè)的客戶端(Unregistered Clients)
? ? ? ? ? ? ? 該規(guī)范沒(méi)有包含未注冊(cè)的客戶端的使用。這種客戶機(jī)的使用超出了本規(guī)范的范圍,需要對(duì)其互操作性影響進(jìn)行額外的安全性分析和審查。
3、協(xié)議的端點(diǎn)(Protocol Endpoints)
? ? ??授權(quán)處理利用兩個(gè)授權(quán)服務(wù)器終結(jié)點(diǎn):
- 授權(quán)端點(diǎn)
? ? ? ? ??客戶端通過(guò)用戶代理重定向到該端點(diǎn)獲得資源所有者的授權(quán)。
- 令牌端點(diǎn)
? ? ? ? ? 客戶機(jī)用來(lái)交換訪問(wèn)令牌的授權(quán)許可,通常具有客戶端身份驗(yàn)證。
- 重定向端點(diǎn)
? ? ? ? ? 授權(quán)服務(wù)器用于通過(guò)資源所有者用戶代理將包含授權(quán)憑證的響應(yīng)返回給客戶端。
? ? ? 并不是每一個(gè)授權(quán)許可類型都會(huì)使用這些終結(jié)點(diǎn);當(dāng)然擴(kuò)展的授權(quán)許可類型可以定義自己的終結(jié)點(diǎn)。
? ? 3.1 授權(quán)端點(diǎn)(Authorization Endpoint)
? ? ? ? ? ? ? 授權(quán)終結(jié)點(diǎn)與資源所有者交互獲取一個(gè)授權(quán)許可。首先授權(quán)服務(wù)器必須審核資源所有者的身份信息(授權(quán)服務(wù)器采用什么方式認(rèn)證資源所有者的身份(例如:用戶名、密碼、會(huì)話Cookie),超出了本規(guī)范的訪問(wèn))。
? ? ? ? ? ? ? 授權(quán)URI可能包含?"application/x-www-form-urlencoded"? 格式的必須的查詢組件(query parameters)。端點(diǎn)URI不能包含碎片組件(fragment component)。
? ? ? ? ? ? ??由于對(duì)授權(quán)端點(diǎn)的請(qǐng)求,導(dǎo)致用戶身份驗(yàn)證和明文證書(shū)的傳輸。當(dāng)發(fā)送請(qǐng)求到授權(quán)端點(diǎn)時(shí),授權(quán)服務(wù)器必須要求使用TLS。授權(quán)服務(wù)器必須支持“Get”方法,也可以支持“Post”方法。
? ? ? ? ? ? ? 發(fā)送請(qǐng)求時(shí),沒(méi)有值的參數(shù)會(huì)被省略。授權(quán)服務(wù)器必須忽略無(wú)法識(shí)別的請(qǐng)求參數(shù)。請(qǐng)求和響應(yīng)參數(shù)不應(yīng)包含超過(guò)一次。
? ? 3.1.1?響應(yīng)類型(Response Type)
? ? ? ? ? ? ? 授權(quán)終結(jié)點(diǎn)被授權(quán)碼模式和隱式模式使用。
? ? ? ? ? ? ? 客戶端通過(guò)下列參數(shù)來(lái)通知授權(quán)服務(wù)器期望建立的授權(quán)許可類型流:
? ? ? ? ? ? ??response_type:必須。授權(quán)碼模式時(shí),該值必須為“code”。隱性模式時(shí),該值必須為“token”。還可以為我們自己注冊(cè)的擴(kuò)展值。如果一個(gè)授權(quán)請(qǐng)求確實(shí)該參數(shù),或者授權(quán)服務(wù)器無(wú)法理解該參數(shù),將返回一個(gè)錯(cuò)誤的響應(yīng)。
? ? 3.1.2?重定向終結(jié)點(diǎn)(Redirection Endpoint)
? ? ? ? ? ? ??在完成與資源所有者的交互之后,授權(quán)服務(wù)器將資源所有者的用戶代理引導(dǎo)回客戶端。重定向終結(jié)點(diǎn)URI必須為完整的URI,端點(diǎn)的URI可能包括一個(gè)“application/x-www-form-urlencoded”格式的查詢組件,但不能包含“fragment?”組件。
? ? ?3.1.2.1 終結(jié)點(diǎn)請(qǐng)求機(jī)密性(Endpoint Request Confidentiality)
? ? ? ? ? ? ??當(dāng)請(qǐng)求的響應(yīng)類型為“code”或“token”時(shí),或者當(dāng)我們要傳送機(jī)密的憑證信息時(shí),這個(gè)時(shí)候需要使用TLS。該規(guī)范并不強(qiáng)制使用TLS,因?yàn)樵诰帉?xiě)此規(guī)范時(shí),要求客戶機(jī)部署TLS是許多客戶機(jī)開(kāi)發(fā)人員的一個(gè)重要障礙。如果TLS不可用,在重定向到授權(quán)服務(wù)器之前,應(yīng)該警告資源所有者不安全端點(diǎn)的情況。
? ? ? ? ? ? ??傳輸層安全性的缺乏會(huì)嚴(yán)重影響客戶端和授權(quán)訪問(wèn)的受保護(hù)資源的安全性。當(dāng)授權(quán)過(guò)程作為客戶端委托的終端用戶身份驗(yàn)證的一種形式時(shí)(例如:第三方登錄服務(wù)),傳輸層安全性的使用尤為重要。
? ? ?3.1.2.1?注冊(cè)要求(Registration Requirements)
? ? ? ? ? ? ? 授權(quán)服務(wù)器只接受下面的客戶端的注冊(cè):
- 公共客戶端
- 使用隱式授權(quán)類型的機(jī)密客戶端
? ? ? ? ? ? ? 在使用授權(quán)服務(wù)器之前,應(yīng)該要求所有的客戶端來(lái)注冊(cè)他們的完成授權(quán)后的重定向端點(diǎn)。客戶機(jī)可以使用“state”請(qǐng)求參數(shù)來(lái)實(shí)現(xiàn)每個(gè)請(qǐng)求定制。如果要求完全重定向URI的注冊(cè)是不可能的,授權(quán)服務(wù)器應(yīng)該要求URI scheme, authority, and path的注冊(cè)(允許客戶端動(dòng)態(tài)的改變重定向URI的查詢組)。授權(quán)服務(wù)器也允許客戶端注冊(cè)多個(gè)重定向端點(diǎn)。缺少重定向URI注冊(cè)要求,增加攻擊者利用授權(quán)端點(diǎn)的風(fēng)險(xiǎn)。
? ? ??3.1.2.1?動(dòng)態(tài)配置(Dynamic Configuration)
? ? ? ? ? ? ??如果多個(gè)重定向URI已注冊(cè),或者只有重定向URI的一部分已被注冊(cè),或者重定向URL沒(méi)有被注冊(cè),則在客戶端的授權(quán)請(qǐng)求的查詢組件中,必須包含"redirect_uri"參數(shù)。當(dāng)一個(gè)重定向的URI被包含在授權(quán)請(qǐng)求中時(shí),授權(quán)服務(wù)器必須跟以注冊(cè)的客戶端重定向URI作比較和匹配,如果沒(méi)有就跟客戶端本身的URL作比較。
? ? ?3.1.2.2?無(wú)效端點(diǎn)(Invalid Endpoint)
? ? ? ? ? ? ??如果由于授權(quán)請(qǐng)求參數(shù)缺失,無(wú)效,或者不能匹配無(wú)效的URI,授權(quán)服務(wù)器應(yīng)該告知一個(gè)錯(cuò)誤給資源所有者。
? ? ?3.1.2.2?端點(diǎn)內(nèi)容(Endpoint Content)
? ? ? ? ? ? ? 返回給客戶端的請(qǐng)求通常是一個(gè)HTML文檔。如果HTML響應(yīng)作為重定向請(qǐng)求的結(jié)果直接送達(dá),則HTML文檔中包含的任何腳本都將執(zhí)行對(duì)重定向URI及其所包含的憑據(jù)的完全訪問(wèn)。在重定向端點(diǎn)的響應(yīng)中,客戶端不應(yīng)該包含任何第三方的腳本,相反它應(yīng)該提取出憑證,然后重定向用戶代理到另外的不會(huì)暴露憑證信息的端點(diǎn)。如果,包含第三方腳本,客戶端必須保證首先執(zhí)行自己的腳本。
? ? 3.2 令牌端點(diǎn)(Token Endpoint)
? ? ? ? ? ? ? 令牌端點(diǎn)被客戶端用來(lái)獲取訪問(wèn)令牌(通過(guò)呈現(xiàn)一個(gè)包含授權(quán)信息的授權(quán)許可)或者刷新令牌。除了隱式授權(quán)類型(訪問(wèn)令牌是直接頒發(fā)的。)外,其他的三種授權(quán)許可類型都會(huì)使用令牌端點(diǎn)。? ? ??
? ? ? ? ? ? ? 客戶端獲取令牌端點(diǎn)地址的方法超過(guò)了本規(guī)范的范疇,但是通常都是在一個(gè)服務(wù)文檔中提供。
? ? ? ? ? ? ? 因?yàn)閷?duì)令牌端點(diǎn)的請(qǐng)求會(huì)涉及到憑證的明文傳輸,所有要求必須使用TLS,并且必須使用Post方法。
? ? ? 3.2.1?客戶端授權(quán)(Client Authentication)
? ? ? ? ? ? ? 當(dāng)向令牌端點(diǎn)發(fā)起請(qǐng)求時(shí),為機(jī)密客戶端和其他的客戶端頒發(fā)的客戶端憑證必須和授權(quán)服務(wù)器進(jìn)行授權(quán)。
- 強(qiáng)制頒發(fā)刷新令牌和授權(quán)碼給客戶端。當(dāng)授權(quán)碼被以一種非安全的方式傳輸?shù)街囟ㄏ蚨它c(diǎn),或者重定向URI沒(méi)有被完全的注冊(cè)。
- 通過(guò)禁用客戶端或更改其憑據(jù)來(lái),從受損客戶機(jī)中恢復(fù),從而防止攻擊者濫用被盜的刷新令牌。畢竟改變單一的一組客戶端憑證比注銷整個(gè)刷新令牌要快的多。
- 實(shí)現(xiàn)認(rèn)證管理最佳實(shí)踐,需要定期證書(shū)輪換。實(shí)現(xiàn)整套刷新令牌的輪換是具有挑戰(zhàn)性的,而實(shí)現(xiàn)單一的客戶端證書(shū)輪換非常的簡(jiǎn)單。
? ? ? ? ? ? ?當(dāng)發(fā)送請(qǐng)求的令牌端點(diǎn)時(shí),客戶可以使用“client_id”請(qǐng)求參數(shù)標(biāo)識(shí)本身。在通過(guò)“authorization_code”和“grant_type”對(duì)令牌端點(diǎn)發(fā)起請(qǐng)求時(shí),未經(jīng)身份驗(yàn)證的客戶端必須發(fā)送“client_id”以防止自己無(wú)意間接受一個(gè)來(lái)自于其他客戶端“client_id”的代碼。這樣也防止客戶端的授權(quán)碼被替換,但是這并不對(duì)受保護(hù)的資源提供額外的安全性保障。
? ? 3.2 訪問(wèn)令牌范圍(Access Token Scope)
? ? ? ? ? ? ?通過(guò)在請(qǐng)求中添加參數(shù)"scope",授權(quán)端點(diǎn)和令牌端點(diǎn)允許客戶端指定請(qǐng)求所訪問(wèn)的范圍。同樣的,授權(quán)服務(wù)器也是用“scope”響應(yīng)參數(shù)來(lái)表示頒發(fā)給客戶端的訪問(wèn)令牌的范圍。“scope”參數(shù)的值表示為空格分隔的、區(qū)分大小寫(xiě)的字符串的列表。該字符串由授權(quán)服務(wù)器定義。
? ? ? ? ? ? 基于授權(quán)服務(wù)器的策略和資源所有者的指示,授權(quán)服務(wù)器可能會(huì)完全或者部分忽略客戶端請(qǐng)求的“scope”參數(shù)。如果已發(fā)布的訪問(wèn)令牌范圍與客戶端請(qǐng)求的范圍不同,授權(quán)服務(wù)器必須包含“scope”響應(yīng)參數(shù),告知客戶端實(shí)際范圍授予。
? ? ? ? ? ??如果客戶端在請(qǐng)求授權(quán)時(shí)省略了范圍參數(shù),則授權(quán)服務(wù)器必須使用預(yù)先定義的范圍默認(rèn)值處理請(qǐng)求,或者失敗指示無(wú)效范圍的請(qǐng)求。授權(quán)服務(wù)器應(yīng)該記錄它的范圍要求和默認(rèn)值。
4、獲取授權(quán)(Obtaining Authorization)
? ? ??為了獲得一個(gè)訪問(wèn)令牌,客戶端需要向資源所有者獲得授權(quán),授權(quán)以許可(authorization grant)的形式被呈現(xiàn)。OAuth定義了4中許可類型:authorization code(授權(quán)碼), implicit(隱性),resource owner password credentials(資源所有者密碼憑證), and client credentials(客戶端憑證)。它也提供了擴(kuò)展的機(jī)制來(lái)定義額外的授權(quán)許可類型。
? ? 4.1 授權(quán)碼許可類型(Authorization Code Grant)
? ? ? ? ? ? ? 授權(quán)碼許可類型可以用于獲取訪問(wèn)令牌和刷新令牌,它是為機(jī)密客戶端憑證優(yōu)化的。由于這是一個(gè)基于重定向的流程,客戶端必須能夠與資源所有者的用戶代理(通常是一個(gè)webbrowser)進(jìn)行交互,并能夠接收來(lái)自于授權(quán)服務(wù)器的傳入請(qǐng)求(重定向)。
+----------+| Resource || Owner || |+----------+^|(B)+----|-----+ Client Identifier +---------------+| -+----(A)-- & Redirection URI ---->| || User- | | Authorization || Agent -+----(B)-- User authenticates --->| Server || | | || -+----(C)-- Authorization Code ---<| |+-|----|---+ +---------------+| | ^ v(A) (C) | || | | |^ v | |+---------+ | || |>---(D)-- Authorization Code ---------' || Client | & Redirection URI || | || |<---(E)----- Access Token -------------------'+---------+ (w/ Optional Refresh Token)
注意:通過(guò)上圖可以看到,到客戶端經(jīng)過(guò)用戶代理時(shí),(A)、(B)、(C)被分成了兩步。
圖3:授權(quán)碼流程
(A)客戶端通過(guò)重定向資源所有者的用戶代理重定向到授權(quán)服務(wù)器(注意資源服務(wù)與授權(quán)服務(wù)不是同一臺(tái)服務(wù)器),并在請(qǐng)求中包含客戶端標(biāo)識(shí)符、請(qǐng)求的范圍、本地狀態(tài)、重定向URI等參數(shù),一旦授權(quán)服務(wù)器許可或者拒絕后,就會(huì)返回到用戶代理。
(B)授權(quán)服務(wù)器認(rèn)證資源所有者(通過(guò)用戶代理),確定資源所有者的許可,或者拒絕客戶端的訪問(wèn)請(qǐng)求。
(C)假如資源所有者許可訪問(wèn),根據(jù)早前在客戶端認(rèn)證階段提供的重定向URI,并攜帶參數(shù)授權(quán)碼和本地狀態(tài)(早前在客戶端認(rèn)證階段提供的),重定向用戶代理到客戶端。
(D)通過(guò)在請(qǐng)求中包含授權(quán)碼和重定向URI,客戶端從令牌端點(diǎn)獲取訪問(wèn)令牌。
(E)授權(quán)服務(wù)器驗(yàn)證授權(quán)碼和重定向URI(和客戶端認(rèn)證階段提供的重定向URI進(jìn)行匹配),如果有效,攜帶訪問(wèn)令牌和刷新令牌(可選)響應(yīng)返回。
? ? 4.1.1?授權(quán)請(qǐng)求(Authorization Request)
? ? ? ? ? ? ? 通過(guò)添加下列參數(shù)到查詢組件(query component)中(注意使用?"application/x-www-form-urlencoded" ),發(fā)起對(duì)授權(quán)端點(diǎn)URI的請(qǐng)求。
? ? ? ? ? ? ??response_type(請(qǐng)求類型):必須,值必須為“code”
? ? ? ? ? ? ? client_id(客戶端身份標(biāo)識(shí)):必須
? ? ? ? ? ? ??redirect_uri(重定向URI):可選
? ? ? ? ? ? ??scope(請(qǐng)求的范圍):可選
? ? ? ? ? ? ??state(客戶端本地狀態(tài)):必須,客戶機(jī)用來(lái)維護(hù)請(qǐng)求和回調(diào)之間的狀態(tài)的不透明值。當(dāng)將用戶代理重定向回客戶端時(shí),授權(quán)服務(wù)器包含此值。該參數(shù)應(yīng)用于防止跨站點(diǎn)請(qǐng)求偽造。
? ? ? ? ? ? ? 通過(guò)Http重定向響應(yīng)或者其他用戶代理能夠接受的方式,客戶端將資源所有者導(dǎo)向已構(gòu)建好的URI。例如,客戶端指導(dǎo)用戶代理來(lái)發(fā)起下面的Http請(qǐng)求:
? ? ? ? ? ? ??GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
? ? ? ? ? ? ? Host: server.example.com
? ? ? ? ? ? ? 授權(quán)服務(wù)器驗(yàn)證請(qǐng)求來(lái)保證所有必須的參數(shù)都存在和有效。如果請(qǐng)求有效,授權(quán)服務(wù)器通過(guò)認(rèn)證資源所有者來(lái)獲得授權(quán)決定。如果授權(quán)決定被許可,授權(quán)服務(wù)器就會(huì)重定向用戶代理到客戶端提供的重定向URI。
? ? 4.1.2?授權(quán)響應(yīng)(Authorization Response)
? ? ? ? ? ? ? 如果資源所有者許可訪問(wèn)請(qǐng)求,授權(quán)服務(wù)頒發(fā)一個(gè)授權(quán)碼,并以"application/x-www-form-urlencoded"格式添加下列參數(shù)到重定向URI查詢組件(query)中。
? ? ? ? ? ? ? code:必須。由授權(quán)服務(wù)器生成的授權(quán)碼。授權(quán)碼被頒發(fā)后,必須短暫過(guò)期,降低泄露風(fēng)險(xiǎn),最長(zhǎng)的生命周期推薦10分鐘,客戶端只能使用一次授權(quán)碼;如果被第二次使用時(shí),授權(quán)服務(wù)器必須注銷頒發(fā)給該授權(quán)碼的所有令牌。
? ? ? ? ? ? ? state:狀態(tài)。如果該參數(shù)在之前的客戶端授權(quán)請(qǐng)求中被包含,則返回時(shí)必須原封不動(dòng)的帶上此參數(shù)。
? ? ? ? ? ? ? 例如:授權(quán)服務(wù)器通過(guò)發(fā)送下面的Http 響應(yīng)重定向用戶代理到客戶端。
? ? ? ? ? ? ??HTTP/1.1 302 Found
? ? ? ? ? ? ??Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
? ? ?客戶端必須忽略不能識(shí)別的響應(yīng)參數(shù),授權(quán)碼字符串的長(zhǎng)度本規(guī)范并未定義。客戶端應(yīng)該避免對(duì)授權(quán)碼長(zhǎng)度的猜測(cè),授權(quán)服務(wù)器應(yīng)該記錄下所頒發(fā)的授權(quán)碼的長(zhǎng)度。
? ? 4.1.2.1 錯(cuò)誤響應(yīng)(Error Response)
? ? ? ? ? ? ? 如果由于缺失、無(wú)效、不匹配重定向URI和客戶端標(biāo)識(shí)符,授權(quán)服務(wù)器應(yīng)該通知資源所有者錯(cuò)誤,不能自動(dòng)的重定向用戶代理到無(wú)效的重定向URI。
? ? ? ? ? ? ? 如果資源所有者拒絕客戶端的訪問(wèn)請(qǐng)求,授權(quán)碼服務(wù)器應(yīng)該使用"application/x-www-form-urlencoded"格式添加下列參數(shù)到重定向URI的查詢組件(query component)中。
? ? ? ? ? ? ? error:必須。一個(gè)簡(jiǎn)單的、來(lái)自于包含下面參數(shù)的?ASCII 錯(cuò)誤代碼。
? ? ? ? ? ? ? ? ?invalid_request(無(wú)效請(qǐng)求):請(qǐng)求缺少所需的參數(shù),包括無(wú)效的參數(shù)值,其中包含一次以上的參數(shù),或者是其他格式錯(cuò)誤的。
? ? ? ? ? ? ? ? ?unauthorized_client(未授權(quán)的客戶端):客戶端沒(méi)有授權(quán)使用此方法請(qǐng)求授權(quán)碼。
? ? ? ? ? ? ? ? ?access_denied(訪問(wèn)拒絕):資源所有者或者授權(quán)服務(wù)器拒絕請(qǐng)求。
? ? ? ? ? ? ? ? ?unsupported_response_type(不支持的響應(yīng)類型):授權(quán)服務(wù)器不支持使用此方法獲得授權(quán)代碼。
? ? ? ? ? ? ? ? ?invalid_scope(無(wú)效的請(qǐng)求范圍):請(qǐng)求的范圍無(wú)效、未知或格式錯(cuò)誤。
? ? ? ? ? ? ? ? ?server_error(服務(wù)器錯(cuò)誤):授權(quán)服務(wù)器遇到意外情況,阻止它執(zhí)行請(qǐng)求(因?yàn)楫?dāng)重定向時(shí),一個(gè)500內(nèi)部錯(cuò)誤Http狀態(tài)碼不能返回給客戶端,所以這個(gè)錯(cuò)誤碼是必須的。)。
? ? ? ? ? ? ? ? ?temporarily_unavailable(暫時(shí)不可用):由于臨時(shí)服務(wù)器超載或維護(hù),授權(quán)服務(wù)器目前無(wú)法處理請(qǐng)求。
? ? ? ? ? ? ? error_description(錯(cuò)誤的描述):可選。提供額外信息,人類可讀的ASCII碼文本字符串。幫助客戶端的開(kāi)發(fā)者理解發(fā)生的錯(cuò)誤。
?? ? ? ? ? ? ?error_uri(錯(cuò)誤URI):可選。帶有錯(cuò)誤信息的且可讀的Web頁(yè)面,用于向客戶端開(kāi)發(fā)人員提供關(guān)于錯(cuò)誤的附加信息。
? ? ? ? ? ? ? state(狀態(tài)):可選。如果在客戶機(jī)授權(quán)請(qǐng)求中存在“state”參數(shù),則需要原封不動(dòng)的返回。
? ? ? ? ? ? ? 例如:授權(quán)服務(wù)器通過(guò)發(fā)送下面的Http 響應(yīng)重定向用戶代理到客戶端。? ? ? ?
? ? ? ? ? ? ? HTTP/1.1 302 Found
? ? ? ? ? ? ? Location: https://client.example.com/cb?error=access_denied&state=xyz
? ? 4.1.3?訪問(wèn)令牌請(qǐng)求(Access Token Request)
? ? ? ? ? ? ? 客戶端對(duì)令牌端點(diǎn)發(fā)送請(qǐng)求,并添加下列參數(shù)到查詢組件(query component)中(注意使用?"application/x-www-form-urlencoded" ),在在HTTP請(qǐng)求實(shí)體中使用utf-8字符編碼。
? ? ? ? ? ? ? grant_type(授權(quán)許可類型):必須。值必須為“authorization_code”?
? ? ? ? ? ? ? code(授權(quán)碼):必須。從認(rèn)證服務(wù)器請(qǐng)求的授權(quán)碼。
? ? ? ? ? ? ? redirect_uri(重定向URI):必須。如果重定向URI被包含在授權(quán)請(qǐng)求中,則值必須與客戶端認(rèn)證階段包含的重定向URI相同。
? ? ? ? ? ? ? client_id(客戶端身份標(biāo)識(shí)):必須。如果客戶端不使用授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證。如果客戶端類型是機(jī)密的,或者客戶端已經(jīng)被頒發(fā)的憑證,或者被分配其他的授權(quán)要求,則客戶端必須使用授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證。
? ? ? ? ? ? ??例如,客戶端使用TLS發(fā)送以下HTTP請(qǐng)求:
POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencodedgrant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
授權(quán)服務(wù)器必須: -
- 如果客戶端類型是機(jī)密的,或者客戶端已經(jīng)被頒發(fā)的憑證,或者被分配其他的授權(quán)要求,則客戶端必須使進(jìn)行身份驗(yàn)證。
- 如果客戶端認(rèn)證被包含,則認(rèn)證客戶端。
- 確保授權(quán)碼被發(fā)送到經(jīng)身份驗(yàn)證的機(jī)密客戶機(jī),或者被頒發(fā)給請(qǐng)求中“client_id”標(biāo)識(shí)的公開(kāi)客戶端。
- 審核授權(quán)碼是否有效。
- 如果“redirect_uri”被包含在請(qǐng)求中,確保與之前客戶端認(rèn)證階段提供的“redirect_uri”參數(shù)相等。
- 如果客戶端類型是機(jī)密的,或者客戶端已經(jīng)被頒發(fā)的憑證,或者被分配其他的授權(quán)要求,則客戶端必須使進(jìn)行身份驗(yàn)證。
? ? 4.1.4?訪問(wèn)令牌響應(yīng)(Access Token Response)
? ? ? ? ? ? ? 如果訪問(wèn)令牌請(qǐng)求有效并已被授權(quán),則授權(quán)服務(wù)需頒發(fā)一個(gè)必須的訪問(wèn)令牌和一個(gè)可選的刷新令牌。如果請(qǐng)求客戶端認(rèn)證失敗或者無(wú)效,授權(quán)服務(wù)器將返回錯(cuò)誤的響應(yīng)。
? ? ? ? ? ? ? 成功響應(yīng)的例子:? ? ? ?
HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Cache-Control: no-storePragma: no-cache{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"}
? ?4.2?隱性許可類型(Implicit Grant)
? ? ? ? ? ? ?隱式許可類型用于獲取訪問(wèn)令牌(不支持發(fā)行刷新令牌),并且它對(duì)運(yùn)行特定重定向URI的公共客戶機(jī)進(jìn)行了優(yōu)化。?這些客戶機(jī)通常使用JavaScript等腳本語(yǔ)言實(shí)現(xiàn),并運(yùn)行在客戶端中。由于這是一個(gè)基于重定向的流程,客戶端必須能夠與資源所有者的用戶代理(通常一個(gè)web瀏覽器)進(jìn)行交互,并且能夠接受來(lái)自于授權(quán)服務(wù)傳入(通過(guò)重定向)的請(qǐng)求。
? ? ? ? ? ? ?不像授權(quán)碼許可類型,客戶端分別請(qǐng)求授權(quán)和訪問(wèn)令牌,而是直接接收訪問(wèn)令牌作為授權(quán)請(qǐng)求的結(jié)果。?隱式授權(quán)類型不包括客戶端身份驗(yàn)證,依賴于資源所有者的存在和重定向URI的注冊(cè)。因?yàn)樵L問(wèn)令牌被編碼到重定向URI中,所以它可能暴露在資源所有者和駐留在同一設(shè)備上的其他應(yīng)用程序中。
+----------+| Resource || Owner || |+----------+^|(B)+----|-----+ Client Identifier +---------------+| -+----(A)-- & Redirection URI --->| || User- | | Authorization || Agent -|----(B)-- User authenticates -->| Server || | | || |<---(C)--- Redirection URI ----<| || | with Access Token +---------------+| | in Fragment| | +---------------+| |----(D)--- Redirection URI ---->| Web-Hosted || | without Fragment | Client || | | Resource || (F) |<---(E)------- Script ---------<| || | +---------------++-|--------+| |(A) (G) Access Token| |^ v+---------+| || Client || |+---------+
圖4:隱性許可流程
(A)客戶端將資源服務(wù)器的用戶代理導(dǎo)向授權(quán)端點(diǎn),并包含客戶端標(biāo)識(shí)、請(qǐng)求范圍、本地狀態(tài)、重定向URI等參數(shù),一旦訪問(wèn)被許可,授權(quán)服務(wù)器將返回到用戶代理。
(B)授權(quán)服務(wù)器認(rèn)證資源所有者,并確定資源所有者是許可還是拒絕客戶端的訪問(wèn)請(qǐng)求。
(C)假如資源所有者許可訪問(wèn),根據(jù)早前在客戶端認(rèn)證階段提供的重定向URI,并在URI片段(fragment)中包含訪問(wèn)令牌,重定向用戶代理到客戶端。
(D)用戶代理保留本地UIR片段,向客戶端Web托管資源服務(wù)器發(fā)起請(qǐng)求。
(E)客戶端Web托管資源服務(wù)器返回一個(gè)web頁(yè)面,并包含能夠在URI片段中的提取訪問(wèn)令牌(和其他參數(shù))的腳本。
(F)用戶代理執(zhí)行腳本,提取訪問(wèn)令牌(和其他參數(shù))
(G)用戶代理將訪問(wèn)令牌傳送給客戶端。
? ? 4.2.1?授權(quán)請(qǐng)求(Authorization Request)
? ? ? ? ? ? ??通過(guò)添加下列參數(shù)到查詢組件(query component)中(注意使用?"application/x-www-form-urlencoded" ),發(fā)起對(duì)授權(quán)端點(diǎn)URI的請(qǐng)求。
? ? ? ? ? ? ??response_type(響應(yīng)類型):必須。值必須為“Token”。
? ? ? ? ? ? ? client_id(客戶端標(biāo)識(shí)):必須。
? ? ? ? ? ? ? redirect_uri(重定向URI):可選。
? ? ? ? ? ? ? scope(請(qǐng)求的范圍):可選。
? ? ? ? ? ? ? state(客戶端本地狀態(tài)):推薦。客戶機(jī)用來(lái)維護(hù)請(qǐng)求和回調(diào)之間的狀態(tài)的不透明值。當(dāng)將用戶代理重定向回客戶端時(shí),授權(quán)服務(wù)器包含此值。該參數(shù)應(yīng)用于防止跨站點(diǎn)請(qǐng)求偽造。
? ? ? ? ? ? ? 通過(guò)Http重定向,客戶端將資源所有者導(dǎo)向使用上面參數(shù)構(gòu)造的授權(quán)服務(wù)器URI請(qǐng)求。例如,客戶端指導(dǎo)用戶代理使用TLS來(lái)發(fā)起下面的Http請(qǐng)求:
GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1Host: server.example.com
授權(quán)服務(wù)器驗(yàn)證請(qǐng)求來(lái)保證所有必須的參數(shù)都存在和有效。授權(quán)服務(wù)器必須(因?yàn)樾枰鼇?lái)攜帶訪問(wèn)令牌)驗(yàn)證重定向URI,并與之前客戶端認(rèn)證提供的重定向URI進(jìn)行匹配。如果請(qǐng)求有效,授權(quán)服務(wù)器通過(guò)認(rèn)證資源所有者來(lái)獲得授權(quán)決定(或者通過(guò)其他標(biāo)準(zhǔn)來(lái)獲得授權(quán)許可)。如果授權(quán)決定被許可,授權(quán)服務(wù)器就會(huì)重定向用戶代理到客戶端提供的重定向URI。 4.2.2?授權(quán)響應(yīng)(Authorization Response)
? ? ? ??如果資源所有者許可訪問(wèn)請(qǐng)求,授權(quán)服務(wù)器就會(huì)頒發(fā)一個(gè)訪問(wèn)令牌,并以"application/x-www-form-urlencoded"格式添加下列參數(shù)到重定向URI片段組件(query fragment)中。
? ? ? ?access_token(訪問(wèn)令牌):必須。
? ? ? ?token_type(令牌類型):必須。
? ? ? ?expires_in(過(guò)期時(shí)間):推薦。訪問(wèn)令牌的生命周期,值“3600”表示訪問(wèn)令牌將在一個(gè)小時(shí)后過(guò)期。如果省略,授權(quán)服務(wù)器,應(yīng)該設(shè)置一個(gè)默認(rèn)值,或者通過(guò)其他的方式提供過(guò)期時(shí)間。
? ? ? ?scope(范圍):可選。如果等同于客戶端請(qǐng)求的范圍則可選,否則必須。
? ? ? ?state(狀態(tài)):可選。如果在客戶機(jī)授權(quán)請(qǐng)求中存在“state”參數(shù),則必須原封不動(dòng)的返回。
? ? ? ?授權(quán)服務(wù)器不能頒發(fā)刷新令牌
? ? ? ?例如:授權(quán)服務(wù)器通過(guò)發(fā)送下面的Http 響應(yīng)重定向用戶代理。
HTTP/1.1 302 FoundLocation: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600
開(kāi)發(fā)人員應(yīng)該注意到一些用戶代理不支持在HTTP“l(fā)ocation”響應(yīng)頭字段中包含一個(gè)片段組件。這樣的客戶端會(huì)要求使用其他方法重定向客戶端,而不是一個(gè)3xx重定向響應(yīng)。例如,返回一個(gè)HTML頁(yè)面,其中包含一個(gè)與重定向URI鏈接的動(dòng)作的“繼續(xù)”按鈕。
客戶端必須忽略不能識(shí)別的響應(yīng)參數(shù),授權(quán)碼字符串的長(zhǎng)度本規(guī)范并未定義。客戶端應(yīng)該避免對(duì)授權(quán)碼長(zhǎng)度的猜測(cè),授權(quán)服務(wù)器應(yīng)該記錄下所頒發(fā)的授權(quán)碼的長(zhǎng)度。
? ? 4.2.2.1 錯(cuò)誤響應(yīng)(Error Response)
? ? ? ? ? ? ??如果由于缺失、無(wú)效、不匹配重定向URI和客戶端標(biāo)識(shí)符,授權(quán)服務(wù)器應(yīng)該通知資源所有者錯(cuò)誤,不能自動(dòng)的重定向用戶代理到無(wú)效的重定向URI。
? ? ? ? ? ? ? 如果資源所有者拒絕客戶端的訪問(wèn)請(qǐng)求,授權(quán)碼服務(wù)器應(yīng)該使用"application/x-www-form-urlencoded"格式添加下列參數(shù)到重定向URI的查詢組件(query component)中。
? ? ? ? ? ? ? error:必須。一個(gè)簡(jiǎn)單的、來(lái)自于包含下面參數(shù)的?ASCII 錯(cuò)誤代碼。
? ? ? ? ? ? ? ? ?invalid_request(無(wú)效請(qǐng)求):請(qǐng)求缺少所需的參數(shù),包括無(wú)效的參數(shù)值,其中包含一次以上的參數(shù),或者是其他格式錯(cuò)誤的。
? ? ? ? ? ? ? ? ?unauthorized_client(未授權(quán)的客戶端):客戶端沒(méi)有授權(quán)使用此方法請(qǐng)求授權(quán)碼。
? ? ? ? ? ? ? ? ?access_denied(訪問(wèn)拒絕):資源所有者或者授權(quán)服務(wù)器拒絕請(qǐng)求。
? ? ? ? ? ? ? ? ?unsupported_response_type(不支持的響應(yīng)類型):授權(quán)服務(wù)器不支持使用此方法獲得授權(quán)代碼。
? ? ? ? ? ? ? ? ?invalid_scope(無(wú)效的請(qǐng)求范圍):請(qǐng)求的范圍無(wú)效、未知或格式錯(cuò)誤。
? ? ? ? ? ? ? ? ?server_error(服務(wù)器錯(cuò)誤):授權(quán)服務(wù)器遇到意外情況,阻止它執(zhí)行請(qǐng)求(因?yàn)楫?dāng)重定向時(shí),一個(gè)500內(nèi)部錯(cuò)誤Http狀態(tài)碼不能返回給客戶端,所以這個(gè)錯(cuò)誤碼是必須的。)。
? ? ? ? ? ? ? ? ?temporarily_unavailable(暫時(shí)不可用):由于臨時(shí)服務(wù)器超載或維護(hù),授權(quán)服務(wù)器目前無(wú)法處理請(qǐng)求。
? ? ? ? ? ? ? error_description(錯(cuò)誤的描述):可選。提供額外信息,人類可讀的ASCII碼文本字符串。幫助客戶端的開(kāi)發(fā)者理解發(fā)生的錯(cuò)誤。
?? ? ? ? ? ? ?error_uri(錯(cuò)誤URI):可選。帶有錯(cuò)誤信息的且可讀的Web頁(yè)面,用于向客戶端開(kāi)發(fā)人員提供關(guān)于錯(cuò)誤的附加信息。
? ? ? ? ? ? ? state(狀態(tài)):可選。如果在客戶機(jī)授權(quán)請(qǐng)求中存在“state”參數(shù),則需要原封不動(dòng)的返回。
? ? ? ? ? ? ? 例如:授權(quán)服務(wù)器通過(guò)發(fā)送下面的Http 響應(yīng)重定向用戶代理到客戶端。? ? ? ?
HTTP/1.1 302 FoundLocation: https://client.example.com/cb#error=access_denied&state=xyz
? ?4.3?資源所有者密碼憑證許可類型(Resource Owner Password Credentials Grant)
? ? ? ? ? ? ?只有當(dāng)資源所有者充分信任(例如:客戶端是整個(gè)系統(tǒng)的一部分,或者是特權(quán)應(yīng)用程序,或者其他授權(quán)許可不可用時(shí))客戶端的情況下,才使用該模式。當(dāng)使用該模式時(shí),授權(quán)服務(wù)器應(yīng)該特別小心,并且只有在其他授權(quán)流不可用的情況下,才使用該模式。
? ? ? ? ? ? ?此授權(quán)類型適用于能夠獲得資源所有者證書(shū)的客戶端(用戶名和密碼,通常使用交互式表單)。它還用于遷移現(xiàn)有客戶使用直接的認(rèn)證方案,如HTTP基本或摘要通過(guò)將存儲(chǔ)的憑據(jù)來(lái)訪問(wèn)令牌的OAuth認(rèn)證。
+----------+| Resource || Owner || |+----------+v| Resource Owner(A) Password Credentials|v+---------+ +---------------+| |>--(B)---- Resource Owner ------->| || | Password Credentials | Authorization || Client | | Server || |<--(C)---- Access Token ---------<| || | (w/ Optional Refresh Token) | |+---------+ +---------------+
? 圖5:資源所有者密碼憑證流程
(A)資源所有者向客戶端提供用戶名和密碼。
(B)客戶端通過(guò)包含從資源所有者收到的憑據(jù),請(qǐng)求來(lái)自授權(quán)服務(wù)器令牌端點(diǎn)的訪問(wèn)令牌。當(dāng)發(fā)起請(qǐng)求時(shí),客戶端與授權(quán)服務(wù)器進(jìn)行認(rèn)證。
(C)授權(quán)服務(wù)器認(rèn)證客戶端,并驗(yàn)證資源所有者憑證,如果有效,頒發(fā)一個(gè)訪問(wèn)令牌。
? ? 4.3.1?授權(quán)請(qǐng)求和響應(yīng)(Authorization Request And Response)
? ? ? ? ? ? ??客戶機(jī)獲取資源所有者證書(shū)的方法超出了本規(guī)范的范圍。一旦訪問(wèn)令牌獲得,客戶端必須丟棄憑據(jù)(理想狀態(tài))。
? ? 4.3.2?訪問(wèn)令牌請(qǐng)求(Access Token Request)
? ? ? ? ? ? ? 客戶端對(duì)令牌端點(diǎn)發(fā)送請(qǐng)求,并添加下列參數(shù)到查詢組件(query component)中(注意使用?"application/x-www-form-urlencoded" ),在在HTTP請(qǐng)求實(shí)體中使用utf-8字符編碼。
? ? ? ? ? ? ? grant_type(授權(quán)許可類型):必須。值必須為“password” 。
? ? ? ? ? ? ? username(用戶名):必須 。
? ? ? ? ? ? ? password(密碼):必須。
? ? ? ? ? ? ? scope(請(qǐng)求的范圍):可選
? ? ? ? ? ? ? 例如:客戶端使用TLS發(fā)送下面的請(qǐng)求=>
POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w
授權(quán)服務(wù)器必須: - 如果客戶端是機(jī)密的,則授權(quán)服務(wù)器必須認(rèn)證客戶端。
- 如果客戶端憑證存在,則認(rèn)證客戶端。
- 使用存在的密碼驗(yàn)證策略,驗(yàn)證資源所有者密碼憑證。
由于此訪問(wèn)令牌請(qǐng)求使用資源所有者的密碼,授權(quán)服務(wù)器必須保護(hù)端點(diǎn)不受暴力攻擊(例如使用速度限制、驗(yàn)證碼、彈窗等等)。
? ? 4.3.4?訪問(wèn)令牌響應(yīng)(Access Token Response)
? ? ? ? ? ? ? 如果訪問(wèn)令牌請(qǐng)求有效并已被授權(quán),則授權(quán)服務(wù)需頒發(fā)一個(gè)必須的訪問(wèn)令牌和一個(gè)可選的刷新令牌。如果請(qǐng)求客戶端認(rèn)證失敗或者無(wú)效,授權(quán)服務(wù)器將返回錯(cuò)誤的響應(yīng)。
? ? ? ? ? ? ? 成功響應(yīng)的例子:? ? ? ?
HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Cache-Control: no-storePragma: no-cache{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value" } ? ?4.4 客戶端許可類型(Client Credentials Grant)
? ? ? ? ? ? ?當(dāng)客戶端僅僅想使用自己的憑證請(qǐng)求訪問(wèn)受其控制的,或請(qǐng)求授權(quán)服務(wù)器已經(jīng)配置的另一個(gè)資源所有者的受保護(hù)資源。
? ? ? ? ? ? ?客戶憑證許可類型必須僅由機(jī)密客端使用。
+---------+ +---------------+| | | || |>--(A)- Client Authentication --->| Authorization || Client | | Server || |<--(B)---- Access Token ---------<| || | | |+---------+ +---------------+圖 6: 客戶端憑證流程
(A)客戶端和授權(quán)服務(wù)器進(jìn)行認(rèn)證,并向令牌端點(diǎn)請(qǐng)求訪問(wèn)令牌。
(B)授權(quán)服務(wù)器認(rèn)證客戶端,如果,有效,則頒發(fā)訪問(wèn)令牌。
? ? 4.4.1?授權(quán)請(qǐng)求和響應(yīng)(Authorization Request And Response)
? ? ? ? ? ? ??因?yàn)榭蛻舳藨{證被作為授權(quán)許可,所有不需要其他額外的授權(quán)請(qǐng)求。
? ? 4.4.2?訪問(wèn)令牌請(qǐng)求(Access Token Request)
? ? ? ? ? ? ? 客戶端對(duì)令牌端點(diǎn)發(fā)送請(qǐng)求,并添加下列參數(shù)(注意使用?"application/x-www-form-urlencoded" 格式和utf-8字符編碼)在HTTP請(qǐng)求實(shí)體中。。
? ? ? ? ? ? ? grant_type(授權(quán)許可類型):必須。值必須為“client_credentials” 。
? ? ? ? ? ? ? scope(請(qǐng)求的范圍):可選
? ? ? ? ? ? ? 例如:客戶端使用TLS發(fā)送下面的請(qǐng)求=>
POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_type=client_credentials
授權(quán)服務(wù)器必須認(rèn)證客戶端。
? ? 4.4.4?訪問(wèn)令牌響應(yīng)(Access Token Response)? ? ? ?
? ? ? ? ? ? ? 如果訪問(wèn)令牌請(qǐng)求有效并已被授權(quán),則授權(quán)服務(wù)需頒發(fā)一個(gè)必須的訪問(wèn)令牌和一個(gè)可選的刷新令牌。如果請(qǐng)求客戶端認(rèn)證失敗或者無(wú)效,授權(quán)服務(wù)器將返回錯(cuò)誤的響應(yīng)。
? ? ? ? ? ? ? 成功響應(yīng)的例子:? ?
HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Cache-Control: no-storePragma: no-cache{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"example_parameter":"example_value"} ? ?4.5?擴(kuò)展許可類型(Extension Grant)
? ? ? ? ? ? ?通過(guò)與授權(quán)服務(wù)器進(jìn)行溝通,客戶端將授權(quán)服務(wù)器定義好的授權(quán)許可類型的值作為參數(shù)“grant_type”的值,也可以包含其他的一些參數(shù),向令牌端點(diǎn)發(fā)送請(qǐng)求。
轉(zhuǎn)載于:https://www.cnblogs.com/justmine/p/7766225.html
總結(jié)
以上是生活随笔為你收集整理的从协议入手,剖析OAuth2.0(译 RFC 6749)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于前端开发的相关资料及例子
- 下一篇: [BZOJ1857][Scoi2010]