單點登錄 - OAuth 2.0 授權碼模式(一)


OAuth 2.0定義了四種授權方式

  • 授權碼模式(authorization code)
  • 簡化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)
    授權碼模式是功能最完整、流程最嚴密的授權模式,本篇也是主要去理解這種模式

授權碼模式大概分為 5 個步驟

12

  • 客戶端(Client)向服務提供商(HTTP service)申請創建客戶端(Client_id、Client_Secret)。
  • 用戶(Resource Owner)通過瀏覽器(User Agent)打開后,跳轉到授權頁,客戶端要求用戶授權。
  • 用戶同意給予客戶端授權,返回授權碼(Code)。
  • 客戶端通過授權碼,向認證服務器(Authorization server)申請令牌(Access Token)。
  • 客戶端通過令牌,向資源服務器(Resource server)獲取資源。
1. 獲取Code
response_type:表示授權類型,必選項,此處的值固定為"code"
client_id:表示客戶端的ID,必選項
redirect_uri:表示重定向URL,可選項
scope:表示申請的權限范圍,可選項
state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。
2. 返回Code(用戶授權通過后返回到重定向URL)
code:表示授權碼,必選項。
state:如果客戶端的請求中包含這個參數,認證服務器的回應也必須一模一樣包含這個參數。
3. 客戶端向認證服務器申請Access Token
grant_type:表示使用的授權模式,必選項,此處的值固定為"authorization_code"。
code:表示獲得的授權碼,必選項。
redirect_uri:表示重定向URI,必選項,且必須與上面中的該參數值保持一致。
client_id:表示客戶端ID,必選項。
client_secret : 表示客戶端密鑰,必選項。
4. 認證服務器返回Access Token
access_token:表示訪問令牌,必選項。
token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。
expires_in:表示過期時間,單位為秒。如果省略該參數,必須其他方式設置過期時間。
refresh_token:表示更新令牌,用來獲取下一次的訪問令牌,可選項。
scope:表示權限范圍,如果與客戶端申請的范圍一致,此項可省略。
5. 向資源服務器獲取信息
headers.Accept : media類型,固定值 “application/json”
headers.Authorization 授權,值為返回的token_type + 空格 + access_token

疑問

1. 獲取code時,只傳遞了clent_id,redirect_url等值,服務提供商是怎么知道是哪個用戶授權?

授權時,你已經登錄了服務提供商的網站或者會要求你登錄。

2. 客戶端是怎么知道你已經授權?

授權請求發出后,瀏覽器得到的是一個http的重定向響應,這個地址是你的redirect_url,同時返回code值

3. 為什么要設置獲取code后再去獲取access_token

是為了安全性,直接通過重定向傳回access_token,但是HTTP 302是不安全的, 攻擊者有可能會獲取到access_token,而code不能獲取資源,即使被截取也沒什么用,client通過HTTPS以及密鑰來獲取access_token,以保證安全。

為什么不直接用HTTPS重定向回client

不是所有client都支持HTTPS,為了通用性 和安全性,才衍生出來這么一個code。


免責聲明!

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



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