OAuth基礎知識

OAuth基礎知識

基礎說明:

  • Third-party application:第三方應用程序,既需要認證的客戶端
  • HTTP service:HTTP服務提供商,既用戶信息源
  • Resource Owner:資源所有者
  • User Agent:用戶代理
  • Authorization server:認證服務器,即服務提供商專門用來處理認證的服務器。
  • Resource server:資源服務器,即服務提供商存放用戶生成的資源的服務器。

認證流程

在這裏插入圖片描述

  1. 用戶打開客戶端以後,客戶端要求用戶給予授權。
  2. 用戶同意給予客戶端授權。
  3. 客戶端使用上一步獲得的授權,向認證服務器申請令牌。
  4. 認證服務器對客戶端進行認證以後,確認無誤,同意發放令牌。
  5. 客戶端使用令牌,向資源服務器申請獲取資源。客戶端使用令牌,
  6. 資源服務器確認令牌無誤,同意向客戶端開放資源。

授權模式

  1. 授權碼模式(authorization code):通過客戶端的後臺服務器,與"服務提供商"的認證服務器進行互動。
  2. 簡化模式(implicit):不通過第三方應用程序的服務器,直接在瀏覽器中向認證服務器申請令牌,跳過了"授權碼"這個步驟。
  3. 密碼模式(resource owner password credentials):用戶向客戶端提供自己的用戶名和密碼。客戶端使用這些信息,向"服務商提供商"索要授權。
  4. 客戶端模式(client credentials):客戶端以自己的名義,而不是以用戶的名義,向"服務提供商"進行認證
  1.授權碼模式

在這裏插入圖片描述

  1. 用戶訪問客戶端,後者將前者導向認證服務器。
  2. 用戶選擇是否給予客戶端授權。
  3. 假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。
  4. 客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的後臺的服務器上完成的,對用戶不可見。
  5. 認證服務器覈對了授權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。
    這些步驟所需要的參數。

步驟1.客戶端申請認證的URI,包含以下參數:

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

步驟3.服務器迴應客戶端的URI,包含以下參數:

code:表示授權碼,必選項。該碼的有效期應該很短,通常設爲10分鐘,客戶端只能使用該碼一次,否則會被授權服務器拒絕。該碼與客戶端ID和重定向URI,是一一對應關係。
state:如果客戶端的請求中包含這個參數,認證服務器的迴應也必須一模一樣包含這個參數。
例子:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

步驟4.客戶端向認證服務器申請令牌的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

步驟5,認證服務器發送的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
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}

2.簡化模式

在這裏插入圖片描述

  1. 客戶端將用戶導向認證服務器。
  2. 用戶決定是否給於客戶端授權。
  3. 假設用戶給予授權,認證服務器將用戶導向客戶端指定的"重定向URI",並在URI的Hash部分包含了訪問令牌。
  4. 瀏覽器向資源服務器發出請求,其中不包括上一步收到的Hash值。
  5. 資源服務器返回一個網頁,其中包含的代碼可以獲取Hash值中的令牌。
  6. 瀏覽器執行上一步獲得的腳本,提取出令牌。
  7. 瀏覽器將令牌發給客戶端。

步驟1.中,客戶端發出的HTTP請求,包含以下參數:

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

步驟3,認證服務器迴應客戶端的URI,包含以下參數:

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

3.密碼模式

在這裏插入圖片描述

  1. 用戶向客戶端提供用戶名和密碼。
  2. 客戶端將用戶名和密碼發給認證服務器,向後者請求令牌。
  3. 認證服務器確認無誤後,向客戶端提供訪問令牌。

步驟2,客戶端發出的HTTP請求,包含以下參數:

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

步驟3,認證服務器向客戶端發送訪問令牌,

例子:
 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"
 }

4.客戶端模式

在這裏插入圖片描述

  1. 客戶端向認證服務器進行身份認證,並要求一個訪問令牌。
  2. 認證服務器確認無誤後,向客戶端提供訪問令牌。

步驟1,客戶端發出的HTTP請求,包含以下參數:

granttype:表示授權類型,此處的值固定爲"clientcredentials",必選項。
scope:表示權限範圍,可選項。
例子:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
認證服務器必須以某種方式,驗證客戶端身份

步驟3,認證服務器向客戶端發送訪問令牌

例子:
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,
  "example_parameter":"example_value"
}

更新令牌

     如果用戶訪問的時候,客戶端的"訪問令牌"已經過期,則需要使用"更新令牌"申請一個新的訪問令牌。

客戶端發出更新令牌的HTTP請求,包含以下參數:


granttype:表示使用的授權模式,此處的值固定爲"refreshtoken",必選項。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章