1.什么是OAuth2
OAuth(開放授權(quán))是一個開放標準木蹬,允許用戶授權(quán)第三方移動應(yīng)用訪問他們存儲在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方移動應(yīng)用或分享他們數(shù)據(jù)的所有內(nèi)容彭雾,OAuth2.0是OAuth協(xié)議的延續(xù)版本沪铭,但不向后兼容OAuth 1.0即完全廢止了OAuth1.0。
2.應(yīng)用場景
第三方應(yīng)用授權(quán)登錄:在APP或者網(wǎng)頁接入一些第三方應(yīng)用時峦朗,時長會需要用戶登錄另一個合作平臺,比如QQ竖般,微博甚垦,微信的授權(quán)登錄茶鹃。
原生app授權(quán):app登錄請求后臺接口涣雕,為了安全認證,所有請求都帶token信息闭翩,如果登錄驗證挣郭、請求后臺數(shù)據(jù)。
前后端分離單頁面應(yīng)用(spa):前后端分離框架疗韵,前端請求后臺數(shù)據(jù)兑障,需要進行oauth2安全認證,比如使用vue蕉汪、react后者h5開發(fā)的app流译。
3名詞說明
(1) Third-party application:第三方應(yīng)用程序,本文中又稱"客戶端"(client)者疤,比如打開知乎福澡,使用第三方登錄,選擇qq登錄驹马,這時候知乎就是客戶端革砸。
(2)HTTP service:HTTP服務(wù)提供商,本文中簡稱"服務(wù)提供商"糯累,即上例的qq算利。
(3)Resource Owner:資源所有者,本文中又稱"用戶"(user),即登錄用戶泳姐。
(4)User Agent:用戶代理效拭,本文中就是指瀏覽器。
(5)Authorization server:認證服務(wù)器,即服務(wù)提供商專門用來處理認證的服務(wù)器缎患。
(6)Resource server:資源服務(wù)器借笙,即服務(wù)提供商存放用戶生成的資源的服務(wù)器。它與認證服務(wù)器较锡,可以是同一臺服務(wù)器业稼,也可以是不同的服務(wù)器。
4運行流程
OAuth 2.0的運行流程如下圖蚂蕴,摘自RFC 6749低散。
(A)用戶打開客戶端以后,客戶端要求用戶給予授權(quán)骡楼。
(B)用戶同意給予客戶端授權(quán)熔号。
(C)客戶端使用上一步獲得的授權(quán),向認證服務(wù)器申請令牌鸟整。
(D)認證服務(wù)器對客戶端進行認證以后引镊,確認無誤,同意發(fā)放令牌篮条。
(E)客戶端使用令牌弟头,向資源服務(wù)器申請獲取資源。
(F)資源服務(wù)器確認令牌無誤涉茧,同意向客戶端開放資
源赴恨。
5授權(quán)模式
- 授權(quán)碼模式(authorization code)
- 簡化模式(implicit)
- 密碼模式(resource owner password credentials)
- 客戶端模式(client credentials)
5.1授權(quán)碼模式
授權(quán)碼模式(authorization code)是功能最完整、流程最嚴密的授權(quán)模式伴栓。
(1)用戶訪問客戶端伦连,后者將前者導向認證服務(wù)器,假設(shè)用戶給予授權(quán)钳垮,認證服務(wù)器將用戶導向客戶端事先指定的"重定向URI"(redirection URI)惑淳,同時附上一個授權(quán)碼。
(2)客戶端收到授權(quán)碼饺窿,附上早先的"重定向URI"歧焦,向認證服務(wù)器申請令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向頁面鏈接。請求成功返回code授權(quán)碼短荐,一般有效時間是10分鐘倚舀。
(3)認證服務(wù)器核對了授權(quán)碼和重定向URI,確認無誤后忍宋,向客戶端發(fā)送訪問令牌(access token)和更新令牌(refresh token)痕貌。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向頁面鏈接。
5.2簡化模式
簡化模式(implicit grant type)不通過第三方應(yīng)用程序的服務(wù)器糠排,直接在瀏覽器中向認證服務(wù)器申請令牌舵稠,跳過了"授權(quán)碼"這個步驟,因此得名。所有步驟在瀏覽器中完成哺徊,令牌對訪問者是可見的室琢,且客戶端不需要認證。
流程步驟:
(A)客戶端將用戶導向認證服務(wù)器落追。
(B)用戶決定是否給于客戶端授權(quán)盈滴。
(C)假設(shè)用戶給予授權(quán),認證服務(wù)器將用戶導向客戶端指定的"重定向URI"轿钠,并在URI的Hash部分包含了訪問令牌巢钓。
(D)瀏覽器向資源服務(wù)器發(fā)出請求,其中不包括上一步收到的Hash值疗垛。
(E)資源服務(wù)器返回一個網(wǎng)頁症汹,其中包含的代碼可以獲取Hash值中的令牌。
(F)瀏覽器執(zhí)行上一步獲得的腳本贷腕,提取出令牌背镇。
(G)瀏覽器將令牌發(fā)給客戶端。
請求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用戶名密碼模式
密碼模式(Resource Owner Password Credentials Grant)中泽裳,用戶向客戶端提供自己的用戶名和密碼瞒斩。客戶端使用這些信息诡壁,向"服務(wù)商提供商"索要授權(quán)济瓢。在這種模式中,用戶必須把自己的密碼給客戶端妹卿,但是客戶端不得儲存密碼。這通常用在用戶對客戶端高度信任的情況下蔑鹦。一般不支持refresh token夺克。
步驟說明:
(A)用戶向客戶端提供用戶名和密碼。
(B)客戶端將用戶名和密碼發(fā)給認證服務(wù)器嚎朽,向后者請求令牌铺纽。
(C)認證服務(wù)器確認無誤后,向客戶端提供訪問令牌哟忍。
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客戶端模式(Client Credentials Grant)
指客戶端以自己的名義狡门,而不是以用戶的名義,向"服務(wù)提供商"進行認證锅很。嚴格地說其馏,客戶端模式并不屬于OAuth框架所要解決的問題。在這種模式中爆安,用戶直接向客戶端注冊叛复,客戶端以自己的名義要求"服務(wù)提供商"提供服務(wù),其實不存在授權(quán)問題。
它的步驟如下:
(A)客戶端向認證服務(wù)器進行身份認證褐奥,并要求一個訪問令牌咖耘。
(B)認證服務(wù)器確認無誤后,向客戶端提供訪問令牌撬码。
A步驟中儿倒,客戶端發(fā)出的HTTP請求,包含以下參數(shù):
- granttype:表示授權(quán)類型呜笑,此處的值固定為"clientcredentials"义桂,必選項。
- scope:表示權(quán)限范圍蹈垢,可選項慷吊。
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials