1. 程式人生 > >OAuth 2.0 概念及授權流程梳理

OAuth 2.0 概念及授權流程梳理

本文可以轉載,但請註明出處https://www.cnblogs.com/hellxz/p/oauth2_process.html

OAuth2 的概念

OAuth是一個關於授權的開放網路標準,OAuth2是其2.0版本。

它規定了四種操作流程(授權模式)來確保安全

應用場景有第三方應用的接入、微服務鑑權互信、接入第三方平臺、第一方密碼登入等

Java王國中Spring Security也對OAuth2標準進行了實現。

OAuth2授權模式

OAuth2定義了四種授權模式(授權流程)來對資源的訪問進行控制

  • 授權碼模式(Authorization Code Grant)
  • 隱式授權模式(Implicit Grant)
  • 使用者名稱密碼模式(Resource Owner Password Credentials Grant)
  • 客戶端模式(Client Credentials Grant)

無論哪個模式(流程)都擁有三個必要角色:客戶端授權伺服器資源伺服器,有的還有使用者(資源擁有者),下面簡單介紹下授權流程

授權碼模式(Authorization Code Grant)

授權碼模式是OAuth2目前最安全最複雜的授權流程,先放一張圖,稍做解釋

如上圖,我們可以看到此流程可大致分為三大部分

  • Client Side:使用者+客戶端與授權伺服器的互動
  • Server Side:客戶端與授權伺服器之間的互動
  • Check Access Token:客戶端與資源伺服器之間的互動 + 資源伺服器與授權伺服器之間的互動

整體上來說,可以用一句話概括授權碼模式授權流程

客戶端換取授權碼,客戶端使用授權碼換token,客戶端使用token訪問資源

接下來對這三部分進行一些說明 :

前提條件:

  • 第三方客戶端需要提前與資源擁有方(同時也是授權所有方)協商客戶端id(client_id),客戶端金鑰(client_secret)
  • 文中暫時未將scope、state等依賴具體框架的內容寫進來,這裡可以參考Spring Security OAuth2的實現

Client Side

客戶端換取授權碼

這個客戶端可以是瀏覽器,

  1. 客戶端將client_id + client_secret + 授權模式標識(grant_type) + 回撥地址(redirect_uri)拼成url訪問授權伺服器授權端點
  2. 授權伺服器返回登入介面,要求使用者登入(此時使用者提交的密碼等直接發到授權伺服器,進行校驗)
  3. 授權伺服器返回授權審批介面,使用者授權完成
  4. 授權伺服器返回授權碼到回撥地址

Server Side

客戶端使用授權碼換token

  1. 客戶端接收到授權碼,並使用授權碼 + client_id + client_secret訪問授權伺服器頒發token端點
  2. 授權伺服器校驗通過,頒發token返回給客戶端
  3. 客戶端儲存token到儲存器(推薦cookie)

Check Access Token

客戶端使用token訪問資源

  1. 客戶端在請求頭中新增token,訪問資源伺服器
  2. 資源伺服器收到請求,先呼叫校驗token的方法(可以是遠端呼叫授權伺服器校驗端點,也可以直接訪問授權儲存器手動校對)
  3. 資源伺服器校驗成功,返回資源

這裡的說明省去了一些引數,如scope(請求token的作用域)、state(用於保證請求不被CSRF)、redirect_uri(授權伺服器回撥uri),先理解概念,實現的時候再去要求

隱式授權模式(Implicit Grant)

隱式授權模式大致可分為兩部分:

  • Client Side:使用者+客戶端與授權伺服器的互動
  • Check Access Token:客戶端與資源伺服器之間的互動 + 資源伺服器與授權伺服器之間的互動

用一句話概括授權碼模式授權流程

客戶端讓使用者登入授權伺服器換token,客戶端使用token訪問資源

Client Side

客戶端讓使用者登入授權伺服器換token

  1. 客戶端(瀏覽器或單頁應用)將client_id + client_secret + 授權模式標識(grant_type)+ 回撥地址(redirect_uri)拼成url訪問授權伺服器授權端點

  2. 授權伺服器跳轉使用者登入介面,使用者登入
  3. 使用者授權
  4. 授權伺服器訪問回撥地址返回token給客戶端

Check Access Token

客戶端使用token訪問資源

  1. 客戶端在請求頭中新增token,訪問資源伺服器
  2. 資源伺服器收到請求,先呼叫校驗token的方法(可以是遠端呼叫授權伺服器校驗端點,也可以直接訪問授權儲存器手動校對)
  3. 資源伺服器校驗成功,返回資源

密碼模式(Resource Owner Password Credentials Grant)

密碼模式大體上也分為兩部分:

  • Client Side: 使用者與客戶端互動,客戶端與授權伺服器互動
  • Check Access Token:客戶端與資源伺服器之間的互動 + 資源伺服器與授權伺服器之間的互動

一句話概括使用者名稱密碼模式流程:

使用者在客戶端提交賬號密碼換token,客戶端使用token訪問資源

Client Side

使用者在客戶端提交賬號密碼換token

  1. 客戶端要求使用者登入
  2. 使用者輸入密碼,客戶端將表單中新增客戶端的client_id + client_secret傳送給授權伺服器頒發token端點
  3. 授權伺服器校驗使用者名稱、使用者密碼、client_id、client_secret,均通過返回token到客戶端
  4. 客戶端儲存token

Check Access Token

客戶端使用token訪問資源

  1. 客戶端在請求頭中新增token,訪問資源伺服器
  2. 資源伺服器收到請求,先呼叫校驗token的方法(可以是遠端呼叫授權伺服器校驗端點,也可以直接訪問授權儲存器手動校對)
  3. 資源伺服器校驗成功,返回資源

客戶端模式(Client Credentials Grant)

客戶端模式大體上分為兩部分:

  • Server Side: 客戶端與授權伺服器之間的互動
  • Check Access Token: 客戶端與資源伺服器,資源伺服器與授權伺服器之間的互動

一句話概括客戶端模式授權流程:

客戶端使用自己的標識換token,客戶端使用token訪問資源

Server Side

客戶端使用自己的標識換token

  1. 客戶端使用client_id + client_secret + 授權模式標識訪問授權伺服器的頒發token端點
  2. 授權伺服器校驗通過返回token給客戶端
  3. 客戶端儲存token

Check Access Token

客戶端使用token訪問資源

  1. 客戶端在請求頭中新增token,訪問資源伺服器
  2. 資源伺服器收到請求,先呼叫校驗token的方法(可以是遠端呼叫授權伺服器校驗端點,也可以直接訪問授權儲存器手動校對)
  3. 資源伺服器校驗成功,返回資源

OAuth2授權模式的選型

考慮到授權場景的多樣性,可以參考以下兩種選型方式

  • 按授權需要的多端情況

  • 按客戶端型別與所有者

後記

學習OAuth2有一段時間了,把學到的知識分享出來,行文中難免有錯誤,如果發現還請留言指正,謝謝合作

參考文章與資料:

https://time.geekbang.org/course/intro/84 作者:楊波

https://blog.csdn.net/sinat_25295611/article/details/84980987 作者:Kayfen

How OAuth 2.0 works and how to choose the right flow 作者:Lorenzo Spyna

本文可以轉載,但請註明出處https://www.cnblogs.com/hellxz/p/oauth2_process.h