OAuth 2.0定義了四種授權方式。
1.授權碼模式(authorization token)
2.簡化模式(implicit)
3.密碼模式(resource owner password credentials)
4.用戶端模式(client credential)
在詳細講解OAuth 2.0之前,先了解下面的幾個專業名詞,以便大家更好的去了解
(1)、third-party application : 第三方應用程式 --如CSDN部落格系統
(2)、http service : 服務提供商 --如微信
(3)、user-agent : 使用者代理 --如浏覽器
(4)、authorization server : 認證伺服器 --伺服器提供商專門處理認證的伺服器
(5)、resource owner: 資源擁有者 --比如我是微信使用者
運作流程圖如下:摘抄别人的(邏輯很清晰的圖)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQNVTWq1EeVRUTwgDbiBHaYFGbkNDTwYVbiVHNHpleO1GTulzRilWO5x0LcRHelR3LcJzLctmch1mclRXY39DN4ETOycDN4EDOxMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
一、授權碼模式的圖解
在(A)Client Identifer 的url中,包含以下參數:
(1) response_type:表示授權類型,必須。固定值為"code"
(2) client_id : 用戶端ID ,必選
(3) redirect_uri : 重定向URL,必選
(4) scope:表示申請的權限範圍,可選
(5) 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
在(C)Authorization Code 步驟中,伺服器回應用戶端的URI,包含以下參數:
- code:表示授權碼,必選項。該碼的有效期應該很短,通常設為10分鐘,用戶端隻能使用該碼一次,否則會被授權伺服器拒絕。該碼與用戶端ID和重定向URI,是一一對應關系。
- state:如果用戶端的請求中包含這個參數,認證伺服器的回應也必須一模一樣包含這個參數。
HTTP/1.1 302 Found #302是重定向的http狀态碼
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
D步驟中,用戶端向認證伺服器申請令牌的HTTP請求,包含以下參數:
- grant_type:表示使用的授權模式,必選項,此處的值固定為"authorization_code"。
- code:表示上一步獲得的授權碼,必選項。
- redirect_uri:表示重定向URI,必選項,且必須與A步驟中的該參數值保持一緻。
- 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步驟中,認證伺服器發送的HTTP回複,包含以下參數:
- 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 #Cache-Control : no-store 不緩存任何資料
Pragma: no-caches
{
"access_token":"UNs15sc15Sc16Zcs16SD51S",
"token_type":"example",
"expires_in":3600,
"refresh_token":"ZOKIneafonozn5SCd;",
"example_parameter":"example_value"
}