授權(quán)過程采用兩種授權(quán)端點(diǎn):
授權(quán)端點(diǎn)--客戶端通過用戶代理重定向從資源擁有者以獲得授權(quán)
令牌端點(diǎn)--客戶端使用授權(quán)許可交換訪問令牌,通常伴有客戶端認(rèn)證
以及另一種客戶端端點(diǎn)
重定向端點(diǎn)--授權(quán)服務(wù)器用于通過資源所有者用戶代理向客戶端返回含有授權(quán)憑據(jù)的響應(yīng)终佛。
不是每個(gè)授權(quán)類型都用所有的端點(diǎn)隘世,擴(kuò)展的授權(quán)類型可能會(huì)定義附加的端點(diǎn)
1授權(quán)端點(diǎn)
授權(quán)端點(diǎn)用于和資源擁有者交互并且獲取一個(gè)授權(quán)許可松嘶。授權(quán)服務(wù)器首先必須驗(yàn)證資源擁有者身份念恍。但該規(guī)范并為定義授權(quán)服務(wù)器驗(yàn)證資源擁有者的方式(比如賬號(hào)密碼犁功,session cookies)衡未。
獲取授權(quán)端點(diǎn)位置同樣未定義尸执。
端點(diǎn)URI可能包含application/x-www-form-urlencoded格式的查詢部分,添加額外查詢參數(shù)時(shí)必須保留該部分缓醋。端點(diǎn)URI一定不能包含fragment部分如失。
由于向授權(quán)端點(diǎn)的請(qǐng)求會(huì)引起用于憑據(jù)的明文傳輸,因此授權(quán)服務(wù)器要求在向授權(quán)端點(diǎn)發(fā)送請(qǐng)求時(shí)必須使用TLS送粱。
授權(quán)服務(wù)器對(duì)于授權(quán)端點(diǎn)必須支持使用HTTP
GET方法岖常,可能會(huì)支持POST。
請(qǐng)求中無值參數(shù)和未識(shí)別參數(shù)必須被忽略葫督。請(qǐng)求和響應(yīng)參數(shù)不應(yīng)該被包含超過一次竭鞍。
1.1響應(yīng)類型
授權(quán)端點(diǎn)用于授權(quán)碼類型和隱式授權(quán)流程¢暇担客戶端使用下列參數(shù)通知授權(quán)服務(wù)器期望的許可類型:
response_type
必須包含偎快,值必須是code或者token或者注冊(cè)擴(kuò)展值
擴(kuò)展響應(yīng)類型可能包含空格分割的列表,這種復(fù)雜相應(yīng)類型由他們自己定義洽胶。
如果一個(gè)授權(quán)請(qǐng)求沒有response_type參數(shù)晒夹,或者不能理解相應(yīng)類型,授權(quán)服務(wù)器必須返回error response
1.2重定向端點(diǎn)
完成與資源擁有者交互后姊氓,授權(quán)服務(wù)器引導(dǎo)資源擁有者的用戶代理返回客戶端丐怯。授權(quán)服務(wù)器重定向用戶代理到在客戶端注冊(cè)時(shí)或者發(fā)出授權(quán)請(qǐng)求時(shí)預(yù)先建立的客戶端重定向端點(diǎn)。
重定向端點(diǎn)URI必須是絕對(duì)URI翔横。端點(diǎn)URI可能包含application/x-www-form-urlencoded格式的查詢體读跷,當(dāng)添加額外查詢參數(shù)時(shí)必須保留。端點(diǎn)URI一定不能包含fragment部分禾唁。
1.2.1端點(diǎn)請(qǐng)求的機(jī)密性
當(dāng)響應(yīng)類型是code或者token時(shí)或者重定向請(qǐng)求將導(dǎo)致敏感憑據(jù)通過開放網(wǎng)絡(luò)傳輸時(shí)效览,重定向端點(diǎn)需要使用TLS无切。
缺乏傳輸層安全可能對(duì)客戶端及它被授權(quán)訪問的受保護(hù)資源的安全具有嚴(yán)重影響。當(dāng)授權(quán)過程用作一種客戶端委托的對(duì)最終用戶認(rèn)證(例如丐枉,第三方登錄服務(wù))的形式時(shí)哆键,使用傳輸層安全尤其關(guān)鍵。
1.2.2注冊(cè)要求
授權(quán)服務(wù)器必須要求下列客戶端注冊(cè)其重定向客戶端“
公開客戶端
使用隱式授權(quán)類型的機(jī)密客戶端
授權(quán)服務(wù)器應(yīng)該要求所有的客戶端在使用授權(quán)端點(diǎn)前注冊(cè)重定向端點(diǎn)
授權(quán)服務(wù)器應(yīng)該要求客戶端提供完整的重定向URI瘦锹,如果不能注冊(cè)完整重定向URI籍嘹,那么應(yīng)該要求注冊(cè)URI scheme,authority和path弯院。(請(qǐng)求授權(quán)時(shí)允許客戶端動(dòng)態(tài)變更查詢部分)
授權(quán)服務(wù)器可能允許客戶端注冊(cè)多個(gè)重定向端點(diǎn)辱士。
缺少重定向URI注冊(cè)的要求,可能使攻擊者將授權(quán)端點(diǎn)用作自由重定向端點(diǎn)抽兆。
1.2.3動(dòng)態(tài)配置
如果注冊(cè)多個(gè)重定向URI或者如果只有部分重定向URI被注冊(cè)或者沒有注冊(cè)重定向URI识补。客戶端都必須使用“redirect_uri”請(qǐng)求參數(shù)在授權(quán)請(qǐng)求中包含重定向URI辫红。
當(dāng)授權(quán)請(qǐng)求包含了一個(gè)重定向URI凭涂,授權(quán)服務(wù)器必須比較和匹配至少一個(gè)已注冊(cè)URI。
1.2.4無效端點(diǎn)
如果由于缺失贴妻、無效或不匹配的重定向URI而驗(yàn)證失敗切油,授權(quán)服務(wù)器應(yīng)該通知資源所有者該錯(cuò)誤且不能向無效的重定向URI自動(dòng)重定向用戶代理。
1.2.5端點(diǎn)內(nèi)容
向客戶端端點(diǎn)的重定向請(qǐng)求通常會(huì)引起由用戶代理處理的HTML文檔響應(yīng)名惩。如果HTML響應(yīng)直接作為重定向請(qǐng)求的服務(wù)結(jié)果澎胡,任何包含在HTML文檔中的腳本將執(zhí)行,并具有對(duì)重定向URI和其包含的憑據(jù)的完全訪問權(quán)限娩鹉。
客戶端不應(yīng)該在重定向端點(diǎn)的響應(yīng)中包含任何第三方的腳本(例如攻谁,第三方分析、社交插件弯予、廣告網(wǎng)絡(luò))戚宦。相反,它應(yīng)該從URI中提取憑據(jù)并向另一個(gè)端點(diǎn)重定向用戶代理而不暴露憑據(jù)(在URI中或其他地方)锈嫩。如果包含第三方腳本受楼,客戶端必須確保它自己的腳本(用于從URI中提取憑據(jù)并從URI中刪除)將首先執(zhí)行。
2.token端點(diǎn)
token端點(diǎn)用于客戶端通過展示授權(quán)許可或者可刷新token以獲取訪問token呼寸。token端點(diǎn)被用于除了隱式授權(quán)的其他所有方式艳汽。
這意味著客戶端獲取token端點(diǎn)的位置超出說明的范圍,但是通常會(huì)在服務(wù)文檔中提供对雪。
端點(diǎn)URI可能包含application/x-www-form-urlencoded格式的查詢請(qǐng)求部分河狐,當(dāng)添加額外查詢參數(shù)時(shí)也必須保留。端點(diǎn)URI一定不能包含fragment部分。
由于對(duì)token端點(diǎn)的請(qǐng)求會(huì)導(dǎo)致明文憑據(jù)的傳輸甚牲,因此必須采用TLS义郑。
客戶端請(qǐng)求token時(shí)必須使用POST方法蝶柿。
請(qǐng)求中無值參數(shù)和未識(shí)別參數(shù)必須被忽略丈钙。請(qǐng)求和響應(yīng)參數(shù)不應(yīng)該被包含超過一次。
2.1客戶端認(rèn)證
機(jī)密客戶端或者其他被辦法客戶端憑據(jù)的客戶端在請(qǐng)求token端點(diǎn)時(shí)必須與授權(quán)服務(wù)器進(jìn)行驗(yàn)證交汤〕猓客戶端驗(yàn)證用于:
執(zhí)行刷新token以及授權(quán)碼與客戶端的綁定。當(dāng)授權(quán)碼在不安全通道上向重定向端點(diǎn)傳輸時(shí)芙扎,或者
當(dāng)重定向URI沒有被完全注冊(cè)時(shí)星岗,客戶端身份驗(yàn)證是關(guān)鍵的。
通過禁用客戶端或者改變其憑據(jù)恢復(fù)一個(gè)被盜用的客戶端戒洼,因此組織了攻擊者濫用被盜的刷新令牌俏橘。改變客戶端憑據(jù)顯然快于撤銷所有的刷新令牌。
實(shí)現(xiàn)認(rèn)證管理的最佳實(shí)踐圈浇,要求定期憑證輪轉(zhuǎn)寥掐。輪轉(zhuǎn)一整套刷新令牌可能是艱巨的,而輪轉(zhuǎn)單組客戶端憑據(jù)顯然更容易磷蜀。
向token端點(diǎn)發(fā)送請(qǐng)求時(shí)召耘,一個(gè)客戶端可能使用client_id請(qǐng)求參數(shù)用來標(biāo)志自身。向令牌端點(diǎn)的“authorization_code”和“grant_type”請(qǐng)求中褐隆,未經(jīng)身份驗(yàn)證的客戶端必須發(fā)送它的“client_id”污它,以防止自己無意中接受了本打算給具有另一個(gè)“client_id”的客戶端的代碼。這保護(hù)了客戶端免于被替換認(rèn)證碼庶弃。
3.訪問令牌范圍
認(rèn)證和令牌端點(diǎn)允許客戶端通過scope請(qǐng)求參數(shù)指定訪問請(qǐng)求的范圍衫贬。反過來,認(rèn)證服務(wù)器使用scope響應(yīng)參數(shù)來通知客戶端訪問令牌被頒發(fā)的范圍歇攻。
scope請(qǐng)求參數(shù)用空格分割固惯,大小寫敏感。該string由授權(quán)服務(wù)器定義掉伏。如果值包含了多個(gè)空格分割的字符串缝呕,他們的順序并不重要,并且每個(gè)string為請(qǐng)求區(qū)域附加了一個(gè)額外的訪問范圍斧散。
scope= scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )
授權(quán)服務(wù)器基于服務(wù)器策略或者資源擁有者的指令可能完全或部分的忽略客戶端的scope請(qǐng)求供常。如果頒發(fā)的訪問令牌范圍與客戶端的請(qǐng)求不同,服務(wù)器必須包含scope響應(yīng)參數(shù)通知客戶端實(shí)際的授權(quán)范圍鸡捐。
如果客戶端在請(qǐng)求授權(quán)時(shí)忽略scope請(qǐng)求栈暇,授權(quán)服務(wù)器必須要么使用預(yù)定義的默認(rèn)值或者使請(qǐng)求失敗以指明無效范圍。授權(quán)服務(wù)器應(yīng)該在文檔說明scope需求和默認(rèn)值箍镜。