一、概述
An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.
OAuth是Open Authorization(開放授權)的縮寫,允許使用者授權給第三方應用通路服務提供商所提供的使用者資源,并且保證授權是安全的。
官網位址
二、概念
四種角色:
- Resource owner:資源所有者,也叫使用者
- Resource server:資源伺服器,服務提供商用來存儲資源,以及處理對資源的請求的伺服器
- Client:用戶端,也叫第三方應用,通過擷取使用者的授權,繼而通路使用者在資源伺服器上的資源
- Authorization server:認證伺服器,服務提供商用來處理認證的伺服器,實體上與資源伺服器可以是同一台伺服器
兩種實體:
- HTTP service:服務提供商
- User Agent:使用者代理,通常指浏覽器
三、工作原理
(A) 使用者打開用戶端,用戶端請求使用者授權
(B) 使用者同意授權給用戶端
(C) 用戶端使用擷取的授權,向認證伺服器請求令牌
(D) 認證伺服器對用戶端進行認證,并驗證授權,确認有效後發放令牌給用戶端
(E) 用戶端使用令牌,向資源伺服器請求資源
(F) 資源伺服器驗證令牌,确認有效後處理請求
四、授權類型
用戶端必須擷取使用者的授權,才能夠擷取令牌。OAuth定義了四種擷取授權的方式:
1、授權碼模式(Authorization Code)
是功能最齊全、流程最嚴謹,也是最常用的授權模式。
(A) 使用者通過使用者代理通路用戶端,用戶端将其重定向到認證伺服器
- response_type:表示授權類型,必選項,此種模式固定為“code”
- client_id:表示用戶端ID,必選項
- redirect_uri:表示重定向URI,可選項
- scope:表示申請的權限範圍,可選項
- state:表示用戶端目前狀态,可選項
執行個體:
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) 使用者選擇是否授權給用戶端
(C) 如果使用者授權,認證伺服器将使用者重定向到用戶端事先指定的URI,并附加一個授權碼
- code:表示授權碼,必選項,用戶端隻能使用一次,與用戶端ID和重定向URI一一對應
- state:表示用戶端的狀态
執行個體:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
(D) 用戶端使用授權碼和重定向URI,向認證伺服器申請令牌
- grant_type:表示授權類型,必選項,此種模式固定為“authorization_code”
- code:表示授權碼,必選項
- 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) 認證伺服器驗證授權碼和URI,确認無誤後,向用戶端發放令牌
- access_token:表示通路令牌,必選項
- token_type:表示令牌類型,必選項,可以是bearer或mac類型
- expires_in:表示過期時間,機關為秒。如果省略,則其他方式必須設定
- refresh_token:表示重新整理令牌,可選項,用來擷取下一次的通路令牌
- scope:表示權限範圍,如果與用戶端申請的範圍一緻,可省略
執行個體:
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)
不通過第三方應用的伺服器,直接在浏覽器中進行,不需要使用授權碼。
(A) 使用者通過使用者代理通路用戶端,用戶端将其重定向到認證伺服器
- response_type:表示授權類型,必選項,此種模式固定為“token”
- client_id:表示用戶端ID,必選項
- redirect_uri:表示重定向URI,可選項
- scope:表示申請的權限範圍,可選項
- state:表示用戶端目前狀态,可選項
執行個體:
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) 使用者選擇是否授權給用戶端
(C) 如果使用者授權,認證伺服器将使用者重定向到用戶端事先指定的URI,并在URI的Hash部分包含通路令牌
- access_token:表示通路令牌,必選項
- token_type:表示令牌類型,必選項
- expires_in:表示過期時間,機關為秒。如果省略,則其他方式必須設定
- scope:表示申請的權限範圍,可選項
- state:表示用戶端的狀态
執行個體:
HTTP/1.1 302 Found
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
&state=xyz&token_type=example&expires_in=3600
(D) 浏覽器向資源伺服器發送請求,但不包含Hash值
(E) 資源伺服器傳回一個網頁,包含擷取Hash值中令牌的代碼
(F) 浏覽器執行腳本,擷取令牌
(G) 浏覽器将令牌發送給用戶端
3、密碼憑證模式(Resource Owner Password Credentials)
使用者必須向用戶端提供使用者名和密碼,存在較大的風險。通常隻有在認證伺服器無法通過其他方式進行授權時,才會考慮使用此種模式。
(A) 使用者向用戶端提供使用者名和密碼憑證
(B) 用戶端将使用者名和密碼憑證發送給認證伺服器,并請求令牌
- grant_type:表示授權類型,必選項,此種模式固定為“password”
- username:表示使用者名,必選項
- password:表示密碼,必選項
- scope:表示權限範圍,可選項
執行個體:
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) 認證伺服器确認無誤後,向用戶端發放令牌
4、用戶端憑證模式(Client Credentials)
由用戶端直接向服務提供商進行認證,其實并不存在授權問題。
(A) 用戶端向認證伺服器提供身份憑證,并請求令牌
- grant_type:表示授權類型,必選項,此種模式固定為“client_credentials”
- scope:表示權限範圍,可選項
執行個體:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
(B) 認證伺服器确認無誤後,向用戶端發放令牌
5、重新整理令牌
如果使用者通路的時候,用戶端所擷取的通路令牌已經過期,則需要使用重新整理令牌重新申請新的通路令牌。
用戶端發送的HTTP請求,包括以下參數:
- grant_type:表示授權類型,必選項,此種模式固定為“refresh_token”
- refresh_token:表示之前收到的重新整理令牌,必選項
- scope:表示權限範圍,不能夠超出上次申請的範圍。如果省略,則表示與上次申請的權限範圍一緻
執行個體:
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
幫你深入了解OAuth2.0協定