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和其他參數一起發送過去即可。令牌信息可以通過請求頭或者包含在請求數據中。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM