天天看點

OAuth快速入門

OAuth快速入門

一、概述

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:使用者代理,通常指浏覽器

三、工作原理

OAuth快速入門

(A) 使用者打開用戶端,用戶端請求使用者授權

(B) 使用者同意授權給用戶端

(C) 用戶端使用擷取的授權,向認證伺服器請求令牌

(D) 認證伺服器對用戶端進行認證,并驗證授權,确認有效後發放令牌給用戶端

(E) 用戶端使用令牌,向資源伺服器請求資源

(F) 資源伺服器驗證令牌,确認有效後處理請求

四、授權類型

用戶端必須擷取使用者的授權,才能夠擷取令牌。OAuth定義了四種擷取授權的方式:

1、授權碼模式(Authorization Code)

是功能最齊全、流程最嚴謹,也是最常用的授權模式。

OAuth快速入門

(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)

不通過第三方應用的伺服器,直接在浏覽器中進行,不需要使用授權碼。

OAuth快速入門

(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)

使用者必須向用戶端提供使用者名和密碼,存在較大的風險。通常隻有在認證伺服器無法通過其他方式進行授權時,才會考慮使用此種模式。

OAuth快速入門

(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)

由用戶端直接向服務提供商進行認證,其實并不存在授權問題。

OAuth快速入門

(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協定