第三方登錄實現原理

簡單說,OAuth 就是一種授權機制。數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(token),用來代替密碼,供第三方應用使用。
首先,我們先看一下
底層協議:
OAUTH協議爲用戶資源的授權提供了一個安全的、開放而又簡易的標準。與以往的授權方式不同之處是OAUTH的授權不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權,因此OAUTH是安全的。oAuth是Open Authorization的簡寫。
相關的術語
一、三個URL:

  1. Request Token URL: 獲取未授權的Request Token服務地址;
  2. User Authorization URL: 獲取用戶授權的Request Token服務地址;
  3. Access Token URL: 用授權的Request Token換取Access Token的服務地址;

二、參數定義:
4. OAUTH_consumer_key: 使用者的ID,OAUTH服務的直接使用者是開發者開發出來的應用。所以該參數值的獲取一般是要去OAUTH服務提供商處註冊一個應用,再獲取該應用的OAUTH_consumer_key。
5. OAUTH_consumer_secret:OAUTH_consumer_key對應的密鑰。
6. OAUTH_token:OAUTH進行到最後一步得到的一個“令牌”,通過此“令牌”請求,就可以去擁有資源的網站抓取任意有權限可以被抓取的資源。
7. OAUTH_token_secret:OAUTH_token對應的私鑰。
8. OAUTH_signature_method: 請求串的簽名方法,應用每次向OAUTH三個服務地址發送請求時,必須對請求進行簽名。簽名的方法有:HMAC-SHA1、RSA-SHA1與PLAINTEXT等三種。
9. OAUTH_signature: 用上面的簽名方法對請求的簽名。
10. OAUTH_timestamp: 發起請求的時間戳,其值是距1970 00:00:00 GMT的秒數,必須是大於0的整數。本次請求的時間戳必須大於或者等於上次的時間戳。
11. OAUTH_nonce: 隨機生成的字符串,用於防止請求的重複,防止外界的非法攻擊。
12. OAUTH_version: OAUTH的版本號。

三、響應代碼
13. HTTP 400 Bad Request 請求錯誤
14. Unsupported parameter 參數錯誤
15. Unsupported signature method 簽名方法錯誤
16. Missing required parameter 參數丟失
17. Duplicated OAUTH Protocol Parameter 參數重複
18. HTTP 401 Unauthorized 未授權
19. Invalid Consumer Key 非法key
20. Invalid / expired Token 失效或者非法的token
21. Invalid signature 簽名非法
22. Invalid / used nonce 非法的nonce
四、認證流程:
1. 獲取未授權的request token
請求參數:
OAUTH_consumer_key:消費方鍵值。
OAUTH_signature_method:消費方簽署本請求所用的簽名方法。
OAUTH_signature:簽名,定義於簽署請求 (簽署請求)。
OAUTH_timestamp:定義於Nonceand Timestamp (單次值與時間戳)。
OAUTH_nonce:定義於Nonceand Timestamp (單次值與時間戳)。
OAUTH_version:可選。
額外參數:由服務提供方定義的任意額外參數
服務方返回結果,響應包含如下參數:
OAUTH_token:請求令牌
OAUTH_token_secret:令牌密鑰
附加參數:由服務提供方定義的任意參數。

2. 獲取用戶授權的request token
請求參數:
OAUTH_token:可選。在前述步驟中獲得的請求令牌。服務提供方可以聲明此參數爲必須,也可以允許不包含在授權URL中並提示用戶手工輸入。
OAUTH_callback:可選。消費方可以指定一個URL,當 獲取用戶授權 (獲取用戶授權)成功後,服務提供方將重定向用戶到這個URL。
附加參數:由服務提供方定義的任意參數。
服務提供方將用戶引導回消費方。
如果消費方在OAUTH_callback中提供了回調URL(在消費方引導用戶至服務提供方 (消費方引導用戶至服務提供方)中描述),則服務提供方構造一個HTTP GET請求URL,重定向用戶瀏覽器到該URL,幷包含如下參數:
(1) OAUTH_token:被用戶授權或否決的請求令牌
(2) 回調URL可以包含消費方提供的查詢參數,服務提供方必須保持已有查詢不變並追加OAUTH_token參數。
3. 用授權的request token換取Access Token
消費方請求訪問令牌參數:
OAUTH_consumer_key:消費方鍵值。
OAUTH_token:之前獲取的請求令牌。
OAUTH_signature_method:消費方使用的簽署方法。
OAUTH_signature:簽署請求 (簽署請求)中定義的簽名。
OAUTH_timestamp:在單次值與時間戳 (單次值與時間戳)中定義。
OAUTH_nonce:在單次值與時間戳 (單次值與時間戳)中定義。
OAUTH_version:版本號,可選。
返回參數:
OAUTH_token:訪問令牌。
OAUTH_token_secret:令牌密鑰。
4. 訪問受保護資源
請求參數:
OAUTH_consumer_key:消費方鍵值。
OAUTH_token:訪問令牌。
OAUTH_signature_method:消費方使用的簽署方法。
OAUTH_signature:簽署請求 (簽署請求)中定義的簽名。
OAUTH_timestamp:定義於單次值與時間戳 (單次值與時間戳).
OAUTH_nonce:定義於單次值與時間戳 (單次值與時間戳).
OAUTH_version:版本號,可選。
附加參數:服務提供方指定的附加參數。
授權流程:
在這裏插入圖片描述
OAUTH認證授權就三個步驟,三句話可以概括:
1. 獲取未授權的Request Token
2. 獲取用戶授權的Request Token
3. 用授權的Request Token換取Access Token

當應用拿到Access Token後,就可以有權訪問用戶授權的資源了。大家可能看出來了,這三個步驟不就是對應OAUTH的三個URL服務地址嘛。一點沒錯,上面的三個步驟中,每個步驟分別請求一個URL,並且收到相關信息,並且拿到上步的相關信息去請求接下來的URL直到拿到Access Token。
具體每步執行信息如下:
使用者(第三方軟件)向OAUTH服務提供商請求未授權的Request Token。向Request Token URL發起請求。(請求需要帶上參數,前面說過)
OAUTH服務提供商同意使用者的請求,並向其頒發未經用戶授權的oauth_token與對應的oauth_token_secret,並返回給使用者。
使用者向OAUTH服務提供商請求用戶授權的Request Token。向User Authorization URL發起請求,請求帶上上步拿到的未授權的token與其密鑰。
OAUTH服務提供商將引導用戶授權。該過程可能會提示用戶,你想將哪些受保護的資源授權給該應用。此步可能會返回授權的Request Token也可能不返回。如Yahoo OAUTH就不會返回任何信息給使用者。
Request Token 授權後,使用者將向Access Token URL發起請求,將上步授權的Request Token換取成Access Token。請求的參數見上圖,這個比第一步A多了一個參數就是Request Token。
OAUTH服務提供商同意使用者的請求,並向其頒發Access Token與對應的密鑰,並返回給使用者。
使用者以後就可以使用上步返回的Access Token訪問用戶授權的資源。
具體實現示例,請看我另一篇文章,保證看了不會後悔!
https://blog.csdn.net/weixin_43885417/article/details/105102144

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章