Oauth2.0实现token刷新功能

扣扣技术分享交流群:1125844267

1、Oauth2.0简介

Oauth2.0是一个授权协议,提供了一种解决用户资源共享问题的思路,它不是一种实现。对于java来说,我们可以利用Spring Security OAuth2来实现。

Oauth2.0实现的最基本的思路:
Oauth2.0实现token刷新功能_第1张图片
上图的名词解释:
Oauth2.0实现token刷新功能_第2张图片
几种授权模式:
Oauth2.0实现token刷新功能_第3张图片
授权码模式基本思路:
Oauth2.0实现token刷新功能_第4张图片
微服务架构下的时序图:
Oauth2.0实现token刷新功能_第5张图片

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)代码实现
Oauth2.0实现token刷新功能_第6张图片
Oauth授权服务配置:

  • 1中的配置就是为了在刷新access token的时候能够将refresh token的过期时间也刷新一下;
  • 3中的配置是内容增强器的配置,在生成的jwt(access token)中添加自定义属性,具体内容增强器的实现自行百度;
  • 2中的配置之前是没有的,在实现刷新token时一直报错,在追踪源码,看了别人的配置后加上这个验证用户名密码的实现就可以了

那么最重要的一个点就是在网关这儿。我们要想实现在用户无感的情况下更新token,那么就不能影响本次的请求的情况下去刷新token。既然每次请求都会走网关,那么每次服务返回的结果肯定也会走网关。那么我们结合Spring Cloud Gateway官网了解一下整个请求的过程。
Oauth2.0实现token刷新功能_第7张图片
我们可以清晰的看到,请求和返回各自有各自的一条路线,并且都会经过一堆过滤器,那么我们就可以在本次请求刷新token成功后,继续本次请求到服务,然后在它返回的过程中将刷新的access token和refresh token加入到返回头中给前端保存
全局过滤器中的实现:
Oauth2.0实现token刷新功能_第8张图片
**注意:**有时候可能配置多了会报一些莫名其妙的错误,我们一定要注意过滤器的顺序问题,可以适当的改变一下顺序可能就没问题了
Oauth2.0实现token刷新功能_第9张图片
前端的部分这里就不再赘述,加拦截器,每个返回的结果检查有没有access token和refresh token,有的话就更新。

其实,在实现之前也百度了很多,但是没有找到刷新token的实现,我这个只是一种思路,如果大家有更好的实现方式,大家可以评论交流!

你可能感兴趣的:(java后台功能模块,java,spring,网关,oauth2)