閱讀目錄
- OAuth2 的概念
- OAuth2授權模式
- 授權碼模式(Authorization Code Grant)
- 隱式授權模式(Implicit Grant)
- 密碼模式(Resource Owner Password Credentials Grant)
- 客戶端模式(Client Credentials Grant)
- OAuth2授權模式的選型
- 後記
OAuth2 的概念
OAuth是一個關於授權的開放網絡標準,OAuth2是其2.0版本。
它規定了四種操作流程(授權模式)來確保安全
應用場景有第三方應用的接入、微服務鑑權互信、接入第三方平臺、第一方密碼登錄等
Java王國中Spring Security也對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
這個客戶端可以是瀏覽器,
- 客戶端將client_id + client_secret + 授權模式標識(grant_type) + 回調地址(redirect_uri)拼成url訪問授權服務器授權端點
- 授權服務器返回登錄界面,要求用戶登錄(此時用戶提交的密碼等直接發到授權服務器,進行校驗)
- 授權服務器返回授權審批界面,用戶授權完成
- 授權服務器返回授權碼到回調地址
Server Side
- 客戶端接收到授權碼,並使用授權碼 + client_id + client_secret訪問授權服務器頒發token端點
- 授權服務器校驗通過,頒發token返回給客戶端
- 客戶端保存token到存儲器(推薦cookie)
Check Access Token
客戶端使用token訪問資源
- 客戶端在請求頭中添加token,訪問資源服務器
- 資源服務器收到請求,先調用校驗token的方法(可以是遠程調用授權服務器校驗端點,也可以直接訪問授權存儲器手動校對)
- 資源服務器校驗成功,返回資源
這裡的說明省去了一些參數,如scope(請求token的作用域)、state(用於保證請求不被CSRF)、redirect_uri(授權服務器回調uri),先理解概念,實現的時候再去要求
隱式授權模式(Implicit Grant)
- Client Side:用戶+客戶端與授權服務器的交互
- Check Access Token:客戶端與資源服務器之間的交互 + 資源服務器與授權服務器之間的交互
客戶端讓用戶登錄授權服務器換token,客戶端使用token訪問資源
Client Side
客戶端讓用戶登錄授權服務器換token
- 客戶端(瀏覽器或單頁應用)將client_id + 授權模式標識(grant_type)+ 回調地址(redirect_uri)拼成url訪問授權服務器授權端點
- 授權服務器跳轉用戶登錄界面,用戶登錄
- 用戶授權
- 授權服務器訪問回調地址返回token給客戶端
Check Access Token
客戶端使用token訪問資源
- 客戶端在請求頭中添加token,訪問資源服務器
- 資源服務器收到請求,先調用校驗token的方法(可以是遠程調用授權服務器校驗端點,也可以直接訪問授權存儲器手動校對)
- 資源服務器校驗成功,返回資源
密碼模式(Resource Owner Password Credentials Grant)
密碼模式大體上也分為兩部分:
- Client Side: 用戶與客戶端交互,客戶端與授權服務器交互
- Check Access Token:客戶端與資源服務器之間的交互 + 資源服務器與授權服務器之間的交互
一句話概括用戶名密碼模式流程:
用戶在客戶端提交賬號密碼換token,客戶端使用token訪問資源
Client Side
用戶在客戶端提交賬號密碼換token
- 客戶端要求用戶登錄
- 用戶輸入密碼,客戶端將表單中添加客戶端的client_id + client_secret發送給授權服務器頒發token端點
- 授權服務器校驗用戶名、用戶密碼、client_id、client_secret,均通過返回token到客戶端
- 客戶端保存token
Check Access Token
客戶端使用token訪問資源
- 客戶端在請求頭中添加token,訪問資源服務器
- 資源服務器收到請求,先調用校驗token的方法(可以是遠程調用授權服務器校驗端點,也可以直接訪問授權存儲器手動校對)
- 資源服務器校驗成功,返回資源
客戶端模式(Client Credentials Grant)
客戶端模式大體上分為兩部分:
- Server Side: 客戶端與授權服務器之間的交互
- Check Access Token: 客戶端與資源服務器,資源服務器與授權服務器之間的交互
客戶端使用自己的標識換token,客戶端使用token訪問資源
Server Side
客戶端使用自己的標識換token
- 客戶端使用client_id + client_secret + 授權模式標識訪問授權服務器的頒發token端點
- 授權服務器校驗通過返回token給客戶端
- 客戶端保存token
Check Access Token
客戶端使用token訪問資源
- 客戶端在請求頭中添加token,訪問資源服務器
- 資源服務器收到請求,先調用校驗token的方法(可以是遠程調用授權服務器校驗端點,也可以直接訪問授權存儲器手動校對)
- 資源服務器校驗成功,返回資源
考慮到授權場景的多樣性,可以參考以下兩種選型方式
2.按客戶端類型與所有者
後記
學習OAuth2有一段時間了,把學到的知識分享出來,行文中難免有錯誤,如果發現還請留言指正,謝謝!
閱讀更多 養碼場007 的文章