Spring新的授权服务器Spring Authorization Server入门

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 ClientOAuth2.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中用户授权是需要二次确认的,会跳转到下面这个页面:

Spring Authorization Server授权确认页面

同意授权后,授权服务器会调用 redirect_uri 并携带一个 codestateoauth2-client 发起请求:

GET /foo/bar?code=MCSJnvhXNyjilBaCyw1sCrrArWk1bzsEdxe5Z3EFbkdLwp8ASmum62n4M7Tz45VNpp_16IWboBnXlgG3LEfgN7MQqkf0-vVZufGrQpvRioRcBbesAiawMt4cspTk06ca&state=-fRunxjpG0aziPXnfcW1Iw1Fy_5_NwlUAgxABPOfAb8= HTTP/1.1 
Host: 127.0.0.1:8080

oauth2-clientOAuth2AuthorizationCodeGrantFilter 拦截到 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.1
Host: localhost:9000
Authorization: Basic bWVzc2FnaW5nLWNsaWVudDpzZWNyZXQ=

这里采用的认证方式是 client-authentication-method: client_secret_basic 方式,详见OAuth2.0协议。

授权服务器将Token返回给客户端,完成请求,认证客户端信息如下:

认证客户端信息

到此基于 Spring Authorization Server 整个授权码流程完成了。 完整DEMO可关注公众号: 码农小胖哥 回复 oauthserver 获取。原创不易还请多多点赞、转发、再看。更多细节后面会持续跟进。


原文:Spring新的授权服务器Spring Authorization Server入门 | Java|Spring Security|Spring Boot|Spring Cloud|https://felord.cn 码农小胖哥的博客