一畜伐、概述
An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.
OAuth是Open Authorization(開放授權(quán))的縮寫闰非,允許用戶授權(quán)給第三方應(yīng)用訪問服務(wù)提供商所提供的用戶資源兑宇,并且保證授權(quán)是安全的报腔。
二涝缝、概念
四種角色:
- Resource owner:資源所有者膀斋,也叫用戶
- Resource server:資源服務(wù)器屏积,服務(wù)提供商用來存儲資源,以及處理對資源的請求的服務(wù)器
- Client:客戶端宾舅,也叫第三方應(yīng)用统阿,通過獲取用戶的授權(quán),繼而訪問用戶在資源服務(wù)器上的資源
- Authorization server:認證服務(wù)器筹我,服務(wù)提供商用來處理認證的服務(wù)器扶平,物理上與資源服務(wù)器可以是同一臺服務(wù)器
兩種實體:
- HTTP service:服務(wù)提供商
- User Agent:用戶代理,通常指瀏覽器
三蔬蕊、工作原理
(A) 用戶打開客戶端结澄,客戶端請求用戶授權(quán)
(B) 用戶同意授權(quán)給客戶端
(C) 客戶端使用獲取的授權(quán),向認證服務(wù)器請求令牌
(D) 認證服務(wù)器對客戶端進行認證岸夯,并驗證授權(quán)麻献,確認有效后發(fā)放令牌給客戶端
(E) 客戶端使用令牌,向資源服務(wù)器請求資源
(F) 資源服務(wù)器驗證令牌猜扮,確認有效后處理請求
四勉吻、授權(quán)類型
客戶端必須獲取用戶的授權(quán),才能夠獲取令牌破镰。OAuth定義了四種獲取授權(quán)的方式:
1餐曼、授權(quán)碼模式(Authorization Code)
是功能最齊全压储、流程最嚴謹,也是最常用的授權(quán)模式源譬。
(A) 用戶通過用戶代理訪問客戶端集惋,客戶端將其重定向到認證服務(wù)器
- response_type:表示授權(quán)類型,必選項踩娘,此種模式固定為“code”
- client_id:表示客戶端ID刮刑,必選項
- redirect_uri:表示重定向URI,可選項
- scope:表示申請的權(quán)限范圍养渴,可選項
- state:表示客戶端當前狀態(tài)雷绢,可選項
實例:
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
(B) 用戶選擇是否授權(quán)給客戶端
(C) 如果用戶授權(quán),認證服務(wù)器將用戶重定向到客戶端事先指定的URI理卑,并附加一個授權(quán)碼
- code:表示授權(quán)碼翘紊,必選項,客戶端只能使用一次藐唠,與客戶端ID和重定向URI一一對應(yīng)
- state:表示客戶端的狀態(tài)
實例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
(D) 客戶端使用授權(quán)碼和重定向URI帆疟,向認證服務(wù)器申請令牌
- grant_type:表示授權(quán)類型,必選項宇立,此種模式固定為“authorization_code”
- code:表示授權(quán)碼踪宠,必選項
- redirect_uri:表示重定向URI,必選項
- client_id:表示客戶端ID妈嘹,必選項
實例:
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
(E) 認證服務(wù)器驗證授權(quán)碼和URI柳琢,確認無誤后,向客戶端發(fā)放令牌
- access_token:表示訪問令牌润脸,必選項
- token_type:表示令牌類型柬脸,必選項,可以是bearer或mac類型
- expires_in:表示過期時間津函,單位為秒肖粮。如果省略,則其他方式必須設(shè)置
- refresh_token:表示刷新令牌尔苦,可選項,用來獲取下一次的訪問令牌
- scope:表示權(quán)限范圍行施,如果與客戶端申請的范圍一致允坚,可省略
實例:
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"
}
2、簡化模式(Implicit)
不通過第三方應(yīng)用的服務(wù)器蛾号,直接在瀏覽器中進行稠项,不需要使用授權(quán)碼。
(A) 用戶通過用戶代理訪問客戶端鲜结,客戶端將其重定向到認證服務(wù)器
- response_type:表示授權(quán)類型展运,必選項活逆,此種模式固定為“token”
- client_id:表示客戶端ID,必選項
- redirect_uri:表示重定向URI拗胜,可選項
- scope:表示申請的權(quán)限范圍蔗候,可選項
- state:表示客戶端當前狀態(tài),可選項
實例:
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
(B) 用戶選擇是否授權(quán)給客戶端
(C) 如果用戶授權(quán)埂软,認證服務(wù)器將用戶重定向到客戶端事先指定的URI锈遥,并在URI的Hash部分包含訪問令牌
- access_token:表示訪問令牌,必選項
- token_type:表示令牌類型勘畔,必選項
- expires_in:表示過期時間所灸,單位為秒。如果省略炫七,則其他方式必須設(shè)置
- scope:表示申請的權(quán)限范圍爬立,可選項
- state:表示客戶端的狀態(tài)
實例:
HTTP/1.1 302 Found
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
&state=xyz&token_type=example&expires_in=3600
(D) 瀏覽器向資源服務(wù)器發(fā)送請求,但不包含Hash值
(E) 資源服務(wù)器返回一個網(wǎng)頁万哪,包含獲取Hash值中令牌的代碼
(F) 瀏覽器執(zhí)行腳本侠驯,獲取令牌
(G) 瀏覽器將令牌發(fā)送給客戶端
3、密碼憑證模式(Resource Owner Password Credentials)
用戶必須向客戶端提供用戶名和密碼壤圃,存在較大的風險陵霉。通常只有在認證服務(wù)器無法通過其他方式進行授權(quán)時,才會考慮使用此種模式伍绳。
(A) 用戶向客戶端提供用戶名和密碼憑證
(B) 客戶端將用戶名和密碼憑證發(fā)送給認證服務(wù)器踊挠,并請求令牌
- grant_type:表示授權(quán)類型,必選項冲杀,此種模式固定為“password”
- username:表示用戶名效床,必選項
- password:表示密碼,必選項
- scope:表示權(quá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
(C) 認證服務(wù)器確認無誤后剩檀,向客戶端發(fā)放令牌
4、客戶端憑證模式(Client Credentials)
由客戶端直接向服務(wù)提供商進行認證旺芽,其實并不存在授權(quán)問題沪猴。
(A) 客戶端向認證服務(wù)器提供身份憑證,并請求令牌
- grant_type:表示授權(quán)類型采章,必選項运嗜,此種模式固定為“client_credentials”
- 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
(B) 認證服務(wù)器確認無誤后悯舟,向客戶端發(fā)放令牌
5担租、刷新令牌
如果用戶訪問的時候,客戶端所獲取的訪問令牌已經(jīng)過期抵怎,則需要使用刷新令牌重新申請新的訪問令牌奋救。
客戶端發(fā)送的HTTP請求岭参,包括以下參數(shù):
- grant_type:表示授權(quán)類型,必選項尝艘,此種模式固定為“refresh_token”
- refresh_token:表示之前收到的刷新令牌演侯,必選項
- scope:表示權(quán)限范圍,不能夠超出上次申請的范圍利耍。如果省略蚌本,則表示與上次申請的權(quán)限范圍一致
實例:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
參考文章:
阮一峰:理解OAuth 2.0