11月8日Spring官方已經強烈建議使用Spring Authorization Server替換已經過時的Spring Security OAuth2.0,距離Spring Security OAuth2.0結束生命周期還有小半年的時間,是時候做出改變了。目前Spring Authorizati ...
11月8日Spring官方已經強烈建議使用Spring Authorization Server替換已經過時的Spring Security OAuth2.0,距離Spring Security OAuth2.0結束生命周期還有小半年的時間,是時候做出改變了。目前Spring Authorization Server已經進入生產就緒階段。今天跟著胖哥的節奏搞一搞Spring Authorization Server授權伺服器框架。
目前Spring Security的體系
在目前的Spring Security 5.x中將OAuth2.0 Client和OAuth2.0 Resource Server進行了模塊化。
Spring Security是一定要引入的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
如果你要增加OAuth2.0 Client支持,可以引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
如果需要OAuth2.0 Resource Server支持,可以引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-oauth2-resource-server</artifactId>
</dependency>
現在如果你要增加OAuth2.0 Authorization Server支持的話,額外引入下麵的依賴就可以了:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-authorization-server</artifactId>
<!-- 截至現在版本 -->
<version>0.2.0</version>
</dependency>
至此OAuth2.0三大模塊齊活了。
Spring Authorization Server
我們的重點還是回到Spring Authorization Server上,目前該項目已經具備生產就緒能力。研究了幾天後,簡單出了一個DEMO,來幫助希望學習該框架的同學來理解它。
DEMO的流程
本DEMO將對OAuth 2.0的授權碼模式(authorization_code
)進行演示。這裡分兩個項目;
- oauth2-client項目,顧名思義作為OAuth2.0 Client,發起對授權伺服器的請求授權。
- oauth2-server項目,基於Spring Authorization Server搭建的授權伺服器,提供授權服務。
用戶首先通過/oauth2/authorization/{registrationId}
端點向oauth2-client發起請求:
GET /oauth2/authorization/felord HTTP/1.1
Host: 127.0.0.1:8080
被OAuth2AuthorizationRequestRedirectFilter
攔截後組裝成下麵的請求鏈接向授權伺服器oauth2-server發起授權碼授權:
GET /oauth2/authorize?response_type=code&client_id=felord-client&scope=message.read%20message.write&state=0CI0ziUDEnqMgqW0nzRNRCzLrs-9IMbqJzGZ47Zb0gY%3D&redirect_uri=http://127.0.0.1:8080/foo/bar HTTP/1.1
Host: localhost:9000
授權伺服器oauth2-server攔截到該請求後,會先檢查發起該請求的當前用戶是否認證。如果沒有認證就拋出401,跳到授權伺服器的登錄頁面,然後用戶執行了登錄:
POST /login HTTP/1.1
Host: localhost:9000
Content-Type: application/x-www-form-urlencoded
username=felord&password=password&_csrf=301a7baf-9e9a-4b17-acd4-613c809bf7f5
成功登錄後進行了302跳轉,繼續執行/oauth2/authorize
授權請求。這時會判斷授權請求是否需要用戶授權確認,在本DEMO中用戶授權是需要二次確認的,會跳轉到下麵這個頁面:
同意授權後,授權伺服器會調用redirect_uri
並攜帶一個code
和state
向oauth2-client發起請求:
GET /foo/bar?code=MCSJnvhXNyjilBaCyw1sCrrArWk1bzsEdxe5Z3EFbkdLwp8ASmum62n4M7Tz45VNpp_16IWboBnXlgG3LEfgN7MQqkf0-vVZufGrQpvRioRcBbesAiawMt4cspTk06ca&state=-fRunxjpG0aziPXnfcW1Iw1Fy_5_NwlUAgxABPOfAb8= HTTP/1.1
Host: 127.0.0.1:8080
oauth2-client的OAuth2AuthorizationCodeGrantFilter
攔截到redirect_uri
後向授權伺服器發起/oauth2/token
請求:
POST /oauth2/token?grant_type=authorization_code&code=MCSJnvhXNyjilBaCyw1sCrrArWk1bzsEdxe5Z3EFbkdLwp8ASmum62n4M7Tz45VNpp_16IWboBnXlgG3LEfgN7MQqkf0-vVZufGrQpvRioRcBbesAiawMt4cspTk06ca&redirect_uri=https://127.0.0.1:8080/foo/bar HTTP/1.1Host: localhost:9000Authorization: Basic bWVzc2FnaW5nLWNsaWVudDpzZWNyZXQ=
這裡採用的認證方式是
client-authentication-method: client_secret_basic
方式,詳見OAuth2.0協議。
授權伺服器將Token返回給客戶端,完成請求,認證客戶端信息如下:
到此基於Spring Authorization Server整個授權碼流程完成了。
DEMO地址:https://gitee.com/felord/spring-security-oauth2-tutorial
關註公眾號:Felordcn 獲取更多資訊
博主:碼農小胖哥 出處:felord.cn 本文版權歸原作者所有,不可商用,轉載需要聲明出處,否則保留追究法律責任的權利。如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。 |