您好,登錄后才能下訂單哦!
OAuth 2.0 授權(quán)框架能夠是第三方應(yīng)用獲取應(yīng)用被保護(hù)的服務(wù)資源,它是一種授權(quán)互聯(lián)網(wǎng)標(biāo)準(zhǔn),由IETF(Internet Engineering Task Force)管理發(fā)布。
本文主要參考材料為
RFC 6749
接下來(lái)以一個(gè)生活中的例子來(lái)簡(jiǎn)單解釋OAuth3的應(yīng)用場(chǎng)景。
我家所在的小區(qū)門禁系統(tǒng)升級(jí),用戶可以下載物業(yè)的手機(jī)APP,注冊(cè)用戶并通過(guò)物業(yè)審核之后,就可以使用APP中的“藍(lán)牙開(kāi)門”功能開(kāi)啟大門。
有一次,朋友給我打電話說(shuō)要到我家拜訪,通過(guò)訪客邀請(qǐng)功能填寫基本的信息,然后發(fā)送一個(gè)微信小程序鏈接給朋友
朋友點(diǎn)開(kāi)小程序,點(diǎn)擊一鍵開(kāi)門就可以進(jìn)入小區(qū),當(dāng)天有效并且限制使用8次
整個(gè)過(guò)程就相當(dāng)于一次授權(quán):
小區(qū)可以理解成被保護(hù)的資源,我本人擁有APP的用戶和密碼,登陸后可以使用一鍵開(kāi)門進(jìn)入小區(qū)。
朋友打電話給我申請(qǐng)授權(quán),我通過(guò)APP發(fā)放一個(gè)憑證(微信小程序),朋友可以在憑證有效期內(nèi)進(jìn)入小區(qū)。
授權(quán)機(jī)制可以方便的允許第三方(朋友)訪問(wèn)被保護(hù)的資源(小區(qū)),同時(shí)不需要提供用戶密碼。
(A) 客戶端(Client)向資源擁有者(Resource Owner)申請(qǐng)授權(quán),資源擁有者(Resource Owner)可以直接授權(quán),但最好是通過(guò)Autherization進(jìn)行授權(quán)
(B)客戶端(Client)獲得授權(quán)的允許憑據(jù)(Authorization Grant),在OAuth3.0中該憑據(jù)的獲取有四種類型,授權(quán)碼、隱藏式、用戶密碼和客戶端憑證
(C)客戶端(Client)使用授權(quán)憑據(jù)向授權(quán)服務(wù)器(Authorization Server)申請(qǐng)?jiān)L問(wèn)憑證(Access Token)
(D)認(rèn)證服務(wù)器(Authorization Server)驗(yàn)證申請(qǐng)憑據(jù)(Authorization Grant),驗(yàn)證通過(guò)后頒發(fā)訪問(wèn)憑證(Access Token)
(E)客戶端(Client)使用訪問(wèn)憑證(Access Token)訪問(wèn)資源服務(wù)器(Resource Server)
(F)資源服務(wù)器(Resource Server)驗(yàn)證訪問(wèn)憑證(Access Token),驗(yàn)證通過(guò)后對(duì)客戶端(Client)請(qǐng)求進(jìn)行處理并返回結(jié)果
刷新憑證(Refresh Token)是由認(rèn)證服務(wù)器(Authorization Server)頒發(fā)給客戶端(Client),用于在當(dāng)前憑證失效或者過(guò)期時(shí),重新獲取一個(gè)新的訪問(wèn)憑證(Access Token)。但頒發(fā)刷新憑證(Refresh Token)對(duì)于認(rèn)證服務(wù)器(Authorization Server)是可選擇的功能,如果支持,刷新憑證(Refresh Token)會(huì)與訪問(wèn)憑證(Access Token)一同頒發(fā)
(A)客戶端(Client)使用授權(quán)憑據(jù)(Authorization Grant)請(qǐng)求訪問(wèn)憑證(Access Tonken)
(B)認(rèn)證服務(wù)器(Authorization Server)驗(yàn)證憑據(jù)通過(guò)后,頒發(fā)訪問(wèn)憑證(Access Token)和刷新憑證(Refresh Token)
(C)客戶端(Client)使用訪問(wèn)憑證(Access Token)訪問(wèn)資源服務(wù)器(Resource Server)
(D)資源服務(wù)器(Resource Server)驗(yàn)證訪問(wèn)憑證(Access Token),驗(yàn)證通過(guò)對(duì)請(qǐng)求進(jìn)行處理
(E)步驟(C)、(D)會(huì)不斷重復(fù),直到訪問(wèn)憑證(Access Token)過(guò)期,此時(shí)流程會(huì)跳轉(zhuǎn)至(G)
(F)由于憑證過(guò)期,資源服務(wù)器會(huì)返回憑證過(guò)期的錯(cuò)誤
(G)客戶端(Client)使用刷新憑證(Refresh Token)請(qǐng)求新的訪問(wèn)憑證(Access Token)
(H)認(rèn)證服務(wù)器驗(yàn)證刷新憑證,驗(yàn)證通過(guò),辦法新的訪問(wèn)憑證和刷新憑證
(A)客戶端(Client)使瀏覽器(User-Agent)跳轉(zhuǎn)至認(rèn)證服務(wù)器(Authorization Server)的認(rèn)證接口,請(qǐng)求信息包含客戶端標(biāo)識(shí)、請(qǐng)求范圍、跳轉(zhuǎn)URI(跳轉(zhuǎn)至客戶端,用來(lái)提取授權(quán)碼)
(B)認(rèn)證服務(wù)器(Authorization Server)驗(yàn)證資源所有者(Resource Owner),通常就是用戶填寫用戶名密碼并確認(rèn)是否授權(quán)
(C)認(rèn)證服務(wù)器(Authorization Server)如果驗(yàn)證通過(guò),則會(huì)返回給瀏覽器(User-Agent)步驟(A)中發(fā)送的跳轉(zhuǎn)URI,跳轉(zhuǎn)至客戶端(Client),跳轉(zhuǎn)URI中同時(shí)會(huì)攜帶授權(quán)碼(Authorization Code)
(D)客戶端(Client)使用授權(quán)碼(Authorization Server)向認(rèn)證服務(wù)器(Authorization Server)請(qǐng)求訪問(wèn)憑證(Access Token),同時(shí)還會(huì)攜帶跳轉(zhuǎn)URI用于客戶端提取訪問(wèn)憑證(Access Token)
(E)認(rèn)證服務(wù)器(Authorization Server)驗(yàn)證授權(quán)碼(Authorization Server),驗(yàn)證通過(guò)后頒發(fā)訪問(wèn)憑證(Access Token)
請(qǐng)求包含以下參數(shù):
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
響應(yīng)包含以下參數(shù):
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
(A)客戶端(Client)通過(guò)瀏覽器(User-Agent)跳轉(zhuǎn)至認(rèn)證服務(wù)器(Authorization),請(qǐng)求中包含客戶端標(biāo)識(shí)和跳轉(zhuǎn)URI
(B)用戶(Resource Owner)填寫用戶密碼,認(rèn)證服務(wù)器(Authorization)對(duì)其進(jìn)行認(rèn)證
(C)認(rèn)證服務(wù)器(Authorization)認(rèn)證通過(guò)后,返回之前傳入的跳轉(zhuǎn)URI至瀏覽器,跳轉(zhuǎn)URI中以錨點(diǎn)(#)的方式包含訪問(wèn)憑證(Access Token)
(D)瀏覽器(User-Agent)跳轉(zhuǎn)至URI指向的客戶端的Web服務(wù)器,瀏覽器(User-Agent)保留錨點(diǎn)之后的信息
(E)客戶端Web服務(wù)器返回一個(gè)web頁(yè)面(其中包含嵌入的腳本),web頁(yè)面能夠提取錨點(diǎn)中的信息,并發(fā)送完整的URI至客戶端
(F)瀏覽器(User-Agent)執(zhí)行Web頁(yè)面中的腳本
(G)瀏覽器(User-Agent)發(fā)送訪問(wèn)憑證(Access Token)至客戶端(Client)
參數(shù)包括:
GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
參數(shù)包括:
HTTP/1.1 302 Found
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
&state=xyz&token_type=example&expires_in=3600
(A)資源所有者(Resource Owner)提供給客戶端(Client)用戶名和密碼
(B)客戶端(Client)使用用戶名/密碼,向認(rèn)證服務(wù)器(Authorization Server)請(qǐng)求訪問(wèn)憑證(Access Token)
(C)證服務(wù)器(Authorization Server)驗(yàn)證用戶名/密碼,驗(yàn)證通過(guò)后頒發(fā)訪問(wèn)憑證(Access Token)
參數(shù)包括:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
(A)客戶端(Client)向認(rèn)證服務(wù)器(Authorization Server)請(qǐng)求訪問(wèn)憑證(Access Token)
(B)認(rèn)證服務(wù)器(Authorization Server)驗(yàn)證客戶端(Client),如果驗(yàn)證通過(guò)則頒發(fā)訪問(wèn)憑證(Access Token)
參數(shù):
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"example_parameter":"example_value"
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。