Oauth2.0实现token刷新功能
1、Oauth2.0简介
Oauth2.0是一个授权协议,提供了一种解决用户资源共享问题的思路,它不是一种实现。对于java来说,我们可以利用Spring Security OAuth2来实现。
Oauth2.0实现的最基本的思路: 上图的名词解释: 几种授权模式: 授权码模式基本思路: 微服务架构下的时序图:
2、刷新token
(1)基本思路 首先我们要明白,在授权码模式下,在网关请求获取access token的时候,接口会返回一个access token和一个refresh token,我会将这两个值都保存到前端cookies中,每次请求都携带这两个值,网关在验证access token过期后,立马利用refresh token请求接口换去一个新的access token,这个时候接口同样返回两个值,一个access token和refresh token,但是需要注意的是,如果不加特殊配置,refresh token的过期时间的固定不变的。所以,也可能导致用户在使用中突然退出系统,所以,我觉得在刷新access token的时候,同样刷新refresh token也是必要的。 (2)代码实现 Oauth授权服务配置:
-
1中的配置就是为了在刷新access token的时候能够将refresh token的过期时间也刷新一下; 3中的配置是内容增强器的配置,在生成的jwt(access token)中添加自定义属性,具体内容增强器的实现自行百度; 2中的配置之前是没有的,在实现刷新token时一直报错,在追踪源码,看了别人的配置后加上这个验证用户名密码的实现就可以了
那么最重要的一个点就是在网关这儿。我们要想实现在用户无感的情况下更新token,那么就不能影响本次的请求的情况下去刷新token。既然每次请求都会走网关,那么每次服务返回的结果肯定也会走网关。那么我们结合Spring Cloud Gateway官网了解一下整个请求的过程。 我们可以清晰的看到,请求和返回各自有各自的一条路线,并且都会经过一堆过滤器,那么我们就可以在本次请求刷新token成功后,继续本次请求到服务,然后在它返回的过程中将刷新的access token和refresh token加入到返回头中给前端保存。 全局过滤器中的实现: **注意:**有时候可能配置多了会报一些莫名其妙的错误,我们一定要注意过滤器的顺序问题,可以适当的改变一下顺序可能就没问题了 前端的部分这里就不再赘述,加拦截器,每个返回的结果检查有没有access token和refresh token,有的话就更新。
其实,在实现之前也百度了很多,但是没有找到刷新token的实现,我这个只是一种思路,如果大家有更好的实现方式,大家可以评论交流!