oauth2.0學習筆記

簡介

oauth2.0是一種目前被普遍使用的開放式受權協議。各個服務平臺可使用oauth2.0協議來容許平臺用戶受權第三方來獲取用戶的信息數據等。
 

術語

Client : 第三方應用
Resource Owner : 資源擁有者,即平臺用戶
Authorization Server : 認證服務器,即平臺提供的專門處理認證的服務
Resource Server : 資源服務器,平臺給第三方提供資源訪問的服務器,它與認證服務器能夠是同一臺也能夠不是同一臺
User Agent : 用戶代理,即瀏覽器
 
 

協議流程

(A)用戶打開客戶端之後,客戶端要求用戶給予受權
(B)用戶贊成給予客戶端受權。
(C)客戶端使用上一步得到的受權,向認證服務器申請令牌。
(D)認證服務器對客戶端進行認證之後,確認無誤,贊成發放令牌。
(E)客戶端使用令牌,向資源服務器申請獲取資源。
(F)資源服務器確認令牌無誤,贊成向客戶端開放資源。
 

客戶端受權類型

  • 受權碼模式(authorization code)
  • 簡化模式(implict)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)
目前最經常使用的是受權碼模式,所以也只對受權碼模式進行學習。
 

受權碼模式流程

 
(A)用戶訪問客戶端,後者將前者重定向到認證服務器。
(B)用戶選擇是否給予客戶端受權。
(C)假設用戶給予受權,認證服務器將用戶導向客戶端事先指定的"重定向 URI"(redirection URI),同時附上一個受權碼。
(D)客戶端收到受權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一 步是在客戶端的後臺的服務器上完成的,對用戶不可見。
(E)認證服務器覈對了受權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌 (access token)和更新令牌(refresh token)。
 

獲取受權碼(authorization code)

 
請求參數:
參數名稱 是否可選 參數值 說明
response_type
必填 code 響應類型,此處固定值
client_id
必填   客戶端標識
redirect_uri
必填   重定向url
 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
 
返回參數:
參數名稱 是否可選 參數值 說明
code
必填   受權碼,有效時間很短,一次性
state
可選   若是請求中包含,則原樣返回
 
例如:
 HTTP/1.1302 Found
 Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
錯誤響應(JSON):
參數名稱 是否可選 參數值 說明
error
必填 參見「錯誤代碼表」 錯誤代碼
error_description
可選   錯誤描述
error_uri
可選   錯誤信息查看手冊url
 
錯誤代碼表:
錯誤碼 說明
invalid_request
請求格式不正確(參數缺失,重複等)
unauthorized_client
客戶端未受權
access_denied
受權被拒絕
unsupported_response_type
response_type參數指定值不支持
invalid_scope
scope參數有誤
server_error
受權服務器內部錯誤
temporarily_unavailable
受權服務暫時沒法訪問
 
例如:
   HTTP/1.1 302 Found
   Location: https://client.example.com/cb?error=access_denied&state=xyz
注:當請求沒有處理成功(參數正確,獲取到受權碼)時,返回錯誤信息時應將http響應的響應碼也更改成對應的含義(500除外,可使用其餘代替)。僅當處理成功時http響應碼才應該被設置爲200.
 

獲取訪問令牌(access token)

 
請求參數:
參數名稱 是否可選 參數值 說明
grant_type
必填
authorization_code
固定值
code
必填   受權碼
redirect_uri
可選   若有,必須和上一步一致
client_id
必填   客戶端標識
client_secret 必填   客戶端祕鑰(該字段平臺定義)
 
例如:
 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
 
返回參數(JSON):
參數名稱 是否可選 參數值 說明
access_token 必填 bearer 訪問令牌
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"
     }
 
錯誤響應(JSON):
參數名稱 是否可選 參數值 說明
error 必填 參見「錯誤代碼表」 錯誤代碼
error_description 可選   錯誤描述
error_uri 可選   錯誤信息查看手冊url
 
錯誤代碼表:
錯誤碼 說明
invalid_request 請求格式不正確(參數缺失,重複等)
invalid_client
客戶端權限校驗失敗
invalid_grant
受權碼或refresh token無效
unauthorized_client
客戶端未被受權使用該受權類型
unsupported_grant_type
受權服務器不支持該受權類型
invalid_scope
scope參數有誤
例如:
     HTTP/1.1 400 Bad Request
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache
 
     {
       "error":"invalid_request"
     }
 
注:當請求沒有處理成功(參數正確,獲取到受權碼)時,返回錯誤信息時應將http響應的響應碼也更改成對應的含義(500除外,可使用其餘代替)。僅當處理成功時http響應碼才應該被設置爲200.
 
HTTP響應碼參考:
302 Found
400 Bad Request
401 Unauthorized
403 Forbidden
503 Service Unavailable
 

刷新訪問令牌

請求參數:
參數名稱 是否可選 參數值 說明
grant_type 必填
refresh_token
固定值
refresh_token 必填   刷新令牌
client_id 必填   客戶端標識
client_secret 必填   客戶端祕鑰
scop 可選   權限範圍
 
注:受權信息能夠經過http請求頭的形式發送。
 
例如:
     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
 
返回參數和錯誤響應與「獲取訪問令牌」一致。
 

訪問保護資源

客戶端訪問用戶受保護資源時,通常只須要訪問平臺給出的url地址,而後將access_token和其餘參數一塊兒發送過去便可。令牌信息能夠經過請求頭或者包含在請求數據中。
相關文章
相關標籤/搜索