1.什么是OAuth2
OAuth(開(kāi)放授權)是一個(gè)開(kāi)放標準,允許用戶(hù)授權第三方移動(dòng)應用訪(fǎng)問(wèn)他們存儲在另外的服務(wù)提供者上的信息,而不需要將用戶(hù)名和密碼提供給第三方移動(dòng)應用或分享他們數據的所有內容,OAuth2.0是OAuth協(xié)議的延續版本,但不向后兼容OAuth 1.0即完全廢止了OAuth1.0。
2.應用場(chǎng)景
第三方應用授權登錄:在A(yíng)PP或者網(wǎng)頁(yè)接入一些第三方應用時(shí),時(shí)長(cháng)會(huì )需要用戶(hù)登錄另一個(gè)合作平臺,比如QQ,微博,微信的授權登錄。
image
原生app授權:app登錄請求后臺接口,為了安全認證,所有請求都帶token信息,如果登錄驗證、請求后臺數據。
前后端分離單頁(yè)面應用(spa):前后端分離框架,前端請求后臺數據,需要進(jìn)行oauth2安全認證,比如使用vue、react后者h5開(kāi)發(fā)的app。
3名詞說(shuō)明
(1) Third-party application:第三方應用程序,本文中又稱(chēng)"客戶(hù)端"(client),比如打開(kāi)知乎,使用第三方登錄,選擇qq登錄,這時(shí)候知乎就是客戶(hù)端。
(2)HTTP service:HTTP服務(wù)提供商,本文中簡(jiǎn)稱(chēng)"服務(wù)提供商",即上例的qq。
(3)Resource Owner:資源所有者,本文中又稱(chēng)"用戶(hù)"(user),即登錄用戶(hù)。
(4)User Agent:用戶(hù)代理,本文中就是指瀏覽器。
(5)Authorization server:認證服務(wù)器,即服務(wù)提供商專(zhuān)門(mén)用來(lái)處理認證的服務(wù)器。
(6)Resource server:資源服務(wù)器,即服務(wù)提供商存放用戶(hù)生成的資源的服務(wù)器。它與認證服務(wù)器,可以是同一臺服務(wù)器,也可以是不同的服務(wù)器。
4運行流程
OAuth 2.0的運行流程如下圖,摘自RFC 6749。
OAuth運行流程
(A)用戶(hù)打開(kāi)客戶(hù)端以后,客戶(hù)端要求用戶(hù)給予授權。
(B)用戶(hù)同意給予客戶(hù)端授權。
(C)客戶(hù)端使用上一步獲得的授權,向認證服務(wù)器申請令牌。
(D)認證服務(wù)器對客戶(hù)端進(jìn)行認證以后,確認無(wú)誤,同意發(fā)放令牌。
(E)客戶(hù)端使用令牌,向資源服務(wù)器申請獲取資源。
(F)資源服務(wù)器確認令牌無(wú)誤,同意向客戶(hù)端開(kāi)放資
源。
5授權模式
授權碼模式(authorization code)
簡(jiǎn)化模式(implicit)
密碼模式(resource owner password credentials)
客戶(hù)端模式(client credentials)
5.1授權碼模式
授權碼模式(authorization code)是功能最完整、流程最嚴密的授權模式。
(1)用戶(hù)訪(fǎng)問(wèn)客戶(hù)端,后者將前者導向認證服務(wù)器,假設用戶(hù)給予授權,認證服務(wù)器將用戶(hù)導向客戶(hù)端事先指定的"重定向URI"(redirection URI),同時(shí)附上一個(gè)授權碼。
(2)客戶(hù)端收到授權碼,附上早先的"重定向URI",向認證服務(wù)器申請令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向頁(yè)面鏈接。請求成功返回code授權碼,一般有效時(shí)間是10分鐘。
(3)認證服務(wù)器核對了授權碼和重定向URI,確認無(wú)誤后,向客戶(hù)端發(fā)送訪(fǎng)問(wèn)令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向頁(yè)面鏈接。
5.2簡(jiǎn)化模式
簡(jiǎn)化模式(implicit grant type)不通過(guò)第三方應用程序的服務(wù)器,直接在瀏覽器中向認證服務(wù)器申請令牌,跳過(guò)了"授權碼"這個(gè)步驟,因此得名。所有步驟在瀏覽器中完成,令牌對訪(fǎng)問(wèn)者是可見(jiàn)的,且客戶(hù)端不需要認證。
image.png
流程步驟:
(A)客戶(hù)端將用戶(hù)導向認證服務(wù)器。
(B)用戶(hù)決定是否給于客戶(hù)端授權。
(C)假設用戶(hù)給予授權,認證服務(wù)器將用戶(hù)導向客戶(hù)端指定的"重定向URI",并在URI的Hash部分包含了訪(fǎng)問(wèn)令牌。
(D)瀏覽器向資源服務(wù)器發(fā)出請求,其中不包括上一步收到的Hash值。
(E)資源服務(wù)器返回一個(gè)網(wǎng)頁(yè),其中包含的代碼可以獲取Hash值中的令牌。
(F)瀏覽器執行上一步獲得的腳本,提取出令牌。
(G)瀏覽器將令牌發(fā)給客戶(hù)端。
請求URL:
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
5.3用戶(hù)名密碼模式
密碼模式(Resource Owner Password Credentials Grant)中,用戶(hù)向客戶(hù)端提供自己的用戶(hù)名和密碼??蛻?hù)端使用這些信息,向"服務(wù)商提供商"索要授權。在這種模式中,用戶(hù)必須把自己的密碼給客戶(hù)端,但是客戶(hù)端不得儲存密碼。這通常用在用戶(hù)對客戶(hù)端高度信任的情況下。一般不支持refresh token。
image.png
步驟說(shuō)明:
(A)用戶(hù)向客戶(hù)端提供用戶(hù)名和密碼。
(B)客戶(hù)端將用戶(hù)名和密碼發(fā)給認證服務(wù)器,向后者請求令牌。
(C)認證服務(wù)器確認無(wú)誤后,向客戶(hù)端提供訪(fǎng)問(wèn)令牌。
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
<article class="hentry">
5.4客戶(hù)端模式(Client Credentials Grant)
指客戶(hù)端以自己的名義,而不是以用戶(hù)的名義,向"服務(wù)提供商"進(jìn)行認證。嚴格地說(shuō),客戶(hù)端模式并不屬于OAuth框架所要解決的問(wèn)題。在這種模式中,用戶(hù)直接向客戶(hù)端注冊,客戶(hù)端以自己的名義要求"服務(wù)提供商"提供服務(wù),其實(shí)不存在授權問(wèn)題。
客戶(hù)端模式
它的步驟如下:
(A)客戶(hù)端向認證服務(wù)器進(jìn)行身份認證,并要求一個(gè)訪(fǎng)問(wèn)令牌。
(B)認證服務(wù)器確認無(wú)誤后,向客戶(hù)端提供訪(fǎng)問(wèn)令牌。
A步驟中,客戶(hù)端發(fā)出的HTTP請求,包含以下參數:
granttype:表示授權類(lèi)型,此處的值固定為"clientcredentials",必選項。
scope:表示權限范圍,可選項。
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials