OAuth快速入門

1、概述

An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.html

OAuth是Open Authorization(開放受權)的縮寫,容許用戶受權給第三方應用訪問服務提供商所提供的用戶資源,而且保證受權是安全的。web

官網地址json

2、概念

四種角色:瀏覽器

  • Resource owner:資源全部者,也叫用戶
  • Resource server:資源服務器,服務提供商用來存儲資源,以及處理對資源的請求的服務器
  • Client:客戶端,也叫第三方應用,經過獲取用戶的受權,繼而訪問用戶在資源服務器上的資源
  • Authorization server:認證服務器,服務提供商用來處理認證的服務器,物理上與資源服務器能夠是同一臺服務器

兩種實體:安全

  • HTTP service:服務提供商
  • User Agent:用戶代理,一般指瀏覽器

3、工做原理

(A) 用戶打開客戶端,客戶端請求用戶受權服務器

(B) 用戶贊成受權給客戶端app

(C) 客戶端使用獲取的受權,向認證服務器請求令牌url

(D) 認證服務器對客戶端進行認證,並驗證受權,確認有效後發放令牌給客戶端.net

(E) 客戶端使用令牌,向資源服務器請求資源3d

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

4、受權類型

客戶端必須獲取用戶的受權,纔可以獲取令牌。OAuth定義了四種獲取受權的方式:

一、受權碼模式(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"
}

二、簡化模式(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) 瀏覽器將令牌發送給客戶端

三、密碼憑證模式(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) 認證服務器確認無誤後,向客戶端發放令牌

四、客戶端憑證模式(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) 認證服務器確認無誤後,向客戶端發放令牌

五、刷新令牌

若是用戶訪問的時候,客戶端所獲取的訪問令牌已通過期,則須要使用刷新令牌從新申請新的訪問令牌。

客戶端發送的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協議

相關文章
相關標籤/搜索