基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token
之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0。无论是Spring Security的风格和以及OAuth2都做了较大改动,里面甚至将授权服务器模块都移除了,导致在配置同样功能时,花费了些时间研究新版本的底层原理,这里将一些学习经验分享给大家。
注意:由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 spring-boo-3.3.0(默认引入的Spring Security是6.3.0),JDK版本使用的是19,本系列OAuth2的代码采用Spring Security6.3.0框架,所有代码都在oauth2-study项目上:https://github.com/forever1986/oauth2-study.git
目录
- 1 使用Postman刷新access_token
- 2 刷新token原理
上一章我们对token已经做了比较深入的了解,但是还漏了一个点,就是token刷新。前面说过默认情况下access_token是会过期的,因此需要刷新access_token
1 使用Postman刷新access_token
1)启动lesson04子模块,作为授权服务器
2)参考上一章《系列之九 - 授权服务器–token的获取》中1.1使用Postman获取token,进行前4步,得到access_token和refresh_token
3)刷新token,访问:http://localhost:9000/oauth2/token,配置如下两个图:
跟获取token的接口一样,需要配置Authorization和Body
4)这时候你就会获取到新的access_token
2 刷新token原理
1)我们从接口/oauth2/token就可以知道其使用的还是OAuth2TokenEndpointFilter过滤器,其中2个步骤比较重要,如下图
我们这里可以记住一个准则,在本次系列中,你会看到Filter过滤器处理过程一般都是通过Converter转换请求过来的参数,然后再通过Provider进行逻辑处理。这是一般的准则,后面很多底层原理直接看这2个不同实现类就能看出来。
2)第一步中的authenticationConverter其实是使用OAuth2RefreshTokenAuthenticationConverter实现类,其处理如下图:
3)第二步,使用authenticationManager进行认证,最终其实是使用OAuth2RefreshTokenAuthenticationProvider实现类进行认证并生成token,OAuth2RefreshTokenAuthenticationProvider代码比较长这里不贴,就说几个比较重要的点
- 先去authorizationService获取内存或者数据库存储的授权信息,并判断refresh_token是否有效
- 使用tokenGenerator代理token生成器,分别生成access_token、refresh_token以及id_token
- 将新生成的数据重新调用authorizationService保存
- 返回token数据
结语:本章我们讲解了刷新token的方式以及原理。到目前为止,我们已经对Spring Security实现的授权服务器有了比较深入的了解。下面我们将结合Spring Security,实现一个生产可用的前后端分离的授权服务器。