OAuth2.0認證和授權機制講解


OAuth2.0的基本流程

OAuth協議目前已經升級到了2.0,大部分的網站也是支持OAuth2.0的,因此讓我們先看看OAuth2。

 

 上圖中所涉及到的對象分別為:

  • Client 第三方應用,我們的應用就是一個Client
  • Resource Owner 資源所有者,即用戶
  • Authorization Server 授權服務器,即提供第三方登錄服務的服務器,如Github
  • Resource Server 擁有資源信息的服務器,通常和授權服務器屬於同一應用

根據上圖的信息,我們可以知道OAuth2的基本流程為:

  1. 第三方應用請求用戶授權。
  2. 用戶同意授權,並返回一個憑證(code)
  3. 第三方應用通過第二步的憑證(code)向授權服務器請求授權
  4. 授權服務器驗證憑證(code)通過后,同意授權,並返回一個資源訪問的憑證(Access Token)。
  5. 第三方應用通過第四步的憑證(Access Token)向資源服務器請求相關資源。
  6. 資源服務器驗證憑證(Access Token)通過后,將第三方應用請求的資源返回。

微信OAuth2.0授權登陸系統就是基於OAuth2.0協議標准構建的,只是它的授權服務器和資源服務器都是微信開發平台。

以一個第三方登陸為例

第0步. 引導用戶進行授權:

當用戶希望使用第三方登錄進行登錄時,第三方應用會通過類似下圖【快速登錄】的方式將用戶引導至授權頁面,為了和OAuth基本流程一致,我們將這一步定義為第0步。

 

 

第0.5步. 用戶身份驗證

當我們點擊Github的圖標,我們會進入到Github應用下面,此時實際上進行了一次用戶身份的驗證,之前沒有登錄Github的用戶需要輸入Github的賬號密碼,已登錄的用戶Github會根據Session進行身份確認。此操作我們稱為0.5步。接下來正式進入OAuth2的流程

 

 

第1步. 用戶授權

用戶身份確認后會進入下面這個頁面,該頁面由授權服務器提供,授權服務器會告訴用戶該第三方在授權服務器中提交的相關信息(如果需要實現第三方登錄功能,第三方應用需要向Github、微博等應用中提交應用的相關信息,不同服務可能會需要審核等不同的步驟),以及授權后第三方應用能夠獲取哪些資源。在Github中,最基礎的認證可以訪問用戶的公共信息。如果用戶同意授權,需要主動的點擊【Authorize application】按鈕。

 

 

第2步. 返回用戶憑證(code)

當用戶點擊按鈕同意授權后,授權服務器將生成一個用戶憑證(code),此時授權服務器如何將用戶憑證(code)傳遞給第三方應用呢?

當我們向授權服務器提交應用信息時,通常需要填寫一個redirect_uri,當我們引導用戶進入授權頁面時,也會附帶一個redirect_uri的信息(如Sign in to GitHub · GitHub),當授權服務器驗證兩個URL一致時,會通知瀏覽器跳轉到redirect_uri,同時,在redirect_uri后附加用戶憑證(code)的相關信息,此時,瀏覽器返回第三方應用同時攜帶用戶憑證(code)的相關信息。授權后訪問的redirect_uri如下:

http://tianmaying.com/oauth/github/callback?code=9e3efa6cea739f9aaab2&state=XXX

這樣第三方就得到了臨時憑證code。

其他攻擊者拿到用戶憑證(code)后依然無法獲取到相應的用戶資源,因為還需要授權服務器授權。

第3步. 請求授權服務器授權

要拿到授權服務器的授權,需要以下幾個信息:

  • client_id 標識第三方應用的id,由授權服務器(Github)在第三方應用提交時頒發給第三方應用
  • client_secret 第三方應用和授權服務器之間的安全憑證,由授權服務器(Github)在第三方應用提交時頒發給第三方應用
  • code 第一步中返回的用戶憑證redirect_uri 第一步生成用戶憑證后跳轉到第二步時的地址
  • state 由第三方應用給出的隨機碼

我們看到,上述信息還涉及到第三方應用的安全憑證(client_secret),因此要求OAuth要求該請求必須時POST請求,同時,還必須時HTTPS服務,以此保證獲取到的驗證憑證(Access Token)的安全性。

第4步. 拿到驗證憑證(Access Token)

當授權服務器拿到第3步中的所有信息,驗證通過后,會將Access Token返回給第三方應用。

第5步. 請求訪問用戶資源

拿到驗證憑證(Access Token)后,剩下的事情就很簡單了,資源服務器會提供一系列關於用戶資源的API,拿驗證憑證(Access Token)訪問相應的API即可,例如,在GIthub中,如果你想拿到用戶信息,可以訪問以下API:

GET https://api.github.com/user?access_token=...

第6步. 返回資源

如果驗證憑證(Access Token)是正確的,此時資源服務器就會返回資源信息,此時整個OAuth流程就結束了。

看完OAuth2的資源訪問流程,我們的第三方登錄是如何做的呢?首先我們需要知道兩點:

  • 用戶授權信息在授權服務器中是有記錄的,當用戶第一次授權給相應的第三方應用后,不需要進行再次授權
  • 每個用戶在資源服務器中都有一個唯一的ID(例如微信小程序有個openid),第三方應用可以將其存儲起來並與本地用戶系統一一對應起來

這樣,當用戶第一次授權並且注冊后(主動注冊或者第三方應用使用用戶信息默認注冊),當再次點擊第三方登錄的按鈕,瀏覽器跳轉到授權服務器,授權服務器通過Session找到用戶的授權信息,發現該用戶已經授權給該第三方應用,將直接跳轉到redirect_uri,此時第三方應用通過唯一的用戶ID找到相應的本地用戶,自動幫助其登錄。

這樣,就可以達到直接點擊第三方登錄按鈕,不需要任何操作,經過幾次跳轉后自動登錄的效果了。大家快去試試吧。

 

參考鏈接:https://zhuanlan.zhihu.com/p/20913727


免責聲明!

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



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