OAuth2.0摘要

1、簡介

不使用oauth2.0協議,資源全部者直接給須要使用資源的第三方應用共享憑據時,有這些問題:安全

  • 須要直接共享給第三方應用憑據
  • 須要服務器支持密碼身份驗證
  • 憑據的訪問權限過大,失去對訪問時間和範圍的控制
  • 不能靈活撤銷發出的憑據
  • 任何第三方都要共享憑據

oauth引入了受權層,分離了客戶端和資源全部者的角色服務器

客戶端在請求資源時,被頒發的是另外一套憑據代理

一、角色

oauth的四種角色:code

  • 資源全部者
  • 資源服務器
  • 客戶端
  • 受權服務器

受權服務器和資源服務器能夠是同一臺,受權服務器能夠頒發被多個資源服務器接受的訪問令牌token

二、協議流程

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

客戶端用於從資源全部者得到受權許可(步驟(A)和(B)所示)的更好方法是使用受權服務器做爲中介,而不是直接從資源全部者獲取圖片

三、受權許可

(一)受權碼

客戶端引導資源全部者至受權服務器,許可後受權服務器引導資源全部者帶着code受權碼回到客戶端,客戶端再帶着code訪問受權服務器獲取token資源

(二)隱式許可

簡化的受權碼模式,資源全部者在受權服務器驗證經過之後,直接帶着token令牌返回客戶端。開發

減小請求往返的數量,增長了安全風險。在傳輸的過程當中暴露了令牌,沒有對客戶端作驗證字符串

(三)資源全部者密碼憑據

當資源全部者和客戶端高度信任時,客戶端直接帶着資源全部者的密碼憑據訪問受權服務器,換回tokenoauth2.0

用來一次性獲取令牌,客戶端能夠不用保存資源全部者的密碼憑據

(四)客戶端憑據

當客戶端本身表明資源全部者或者實現和受權服務器約定好時,客戶端帶着本身的憑據訪問受權服務器,換回token

四、訪問令牌

令牌表明了訪問權限的由資源全部者許可並由資源服務器和受權服務器實施的具體範圍和期限

五、刷新令牌

受權服務器能夠在頒發訪問令牌時多頒發一個刷新令牌

  • 用於客戶端在訪問令牌即將過時時向受權服務器換取新訪問令牌
  • 用於客戶端向受權服務器換取權限相等或更窄範圍的訪問令牌
  +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+

 

2、客戶端註冊

客戶端須要在受權服務器上註冊,不用直接交互,能夠依靠其餘方式來創建信任關係

當註冊客戶端時,客戶端開發者應該:

  • 指定客戶端類型
  • 提供客戶端重定向URI
  • 包含受權服務器要求的任何其餘信息(如,應用名稱、網址、描述、Logo圖片、接受法律條款等)

一、客戶端類型

根據安全狀況分:

  • 機密客戶端
  • 公開客戶端

根據客戶端配置分:

  • Web應用程序
  • 基於用戶代理的應用
  • 本機應用程序

二、客戶端標誌

一個表明客戶端提供的註冊信息的惟一字符串

三、客戶端身份驗證

使用client_id和client_secret做爲客戶端憑據

使用Basic Authorization基本認證在請求正文中傳輸,例如:

Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3

 

3、協議端點

受權過程採用了兩種受權服務器端點(HTTP資源):

  • 受權端點——客戶端用其經過用戶代理重定向從資源全部者獲取受權。
  • 令牌端點——客戶端用其將受權許可交換爲訪問令牌,一般伴有客戶端身份驗證。

  以及一種客戶端端點:

  •  重定向端點——受權服務器用其經過資源全部者用戶代理向客戶端返回含有受權憑據的響應。

並非每種受權許可類型都採用兩種端點。

一、受權端點

受權端點被受權碼許可類型和隱式許可類型流程使用

客戶端使用response_type參數通知受權服務器指望的許可類型,"code"是受權碼許可,"token"是隱式許可

完成資源全部者的交互後,受權服務器將用戶代理重定向至重定向端點"redirect_uri"

受權服務器必需要求公開客戶端和採用隱式許可的機密客戶端註冊重定向端點,必須是絕對URI,能夠註冊多個

二、令牌端點

客戶端使用受權許可或刷新令牌從令牌端點獲取令牌,只有隱式許可用不到

當發起令牌請求時必須使用"POST"方法

在向令牌端點發起請求時,機密客戶端或其餘被頒發客戶端憑據的客戶端與受權服務器進行身份驗證,可使用「client_id」請求參數標識本身

三、訪問令牌範圍

客戶端可使用「scope」參數來指定訪問請求的範圍

 

4、得到受權

相關文章
相關標籤/搜索