Spring Cloud微服务安全实战_5-6_refresh token失效处理

摘要:
虽然refresh_token有效期很长但是还是会过期的。2,refresh_token虽然过期了,认证服务器上的session也过期了,那就必须让用户输入用户名密码,进行重新登录。如果token已经过期了,就拿refresh_token去认证服务器刷新令牌,然后将新获取的token存到自己的session,并携带新的token去调用微服务。3,前端代码搞一个全局拦截器,拦截refresh_token失效的响应,因为调用任何服务,都可能返回这个错误响应。

access_token是客户端调用其他微服务调的凭证,access_token有效期不能太长(丢了风险很大),一般可以设置2小时,如果access_token失效了,就不能调用微服务了,上节说了access_token失效的处理---refresh_token来刷新令牌,refresh_token可以设置很长的有效期,比如一个月

下面是用refresh_token刷新令牌的步骤:

1,配置refresh_token

在客户端应用的表里配置 refresh_token 的有效期,然后配置refresh_token授权模式,这样认证服务器在给客户端应用发access_token的同时,也会发一个refresh_token

Spring Cloud微服务安全实战_5-6_refresh token失效处理第1张

(图1)

2, 在客户端应用调用微服务时,从session中拿出token,判token是否过期(在存入session时已经设置了token的过期时间),如果token已过期,就从拿refresh_token换取access_token:

Spring Cloud微服务安全实战_5-6_refresh token失效处理第2张

(图2)

如果refresh_token也过期了怎么处理呢?

虽然refresh_token有效期很长(比如一个月)但是还是会过期的。如果refresh_token也过期了怎么办呢?

答案是:没办法。只能去认证服务器走一遍认证流程。

当重新去认证服务器走授权流程的时候,又分两种情况:

1,refresh_token虽然过期了,但是认证服务器上的session还没过期,走认证流程的时候,认证服务器直接返回一个令牌给客户端应用。

2,refresh_token虽然过期了,认证服务器上的session也过期了,那就必须让用户输入用户名密码,进行重新登录。

情况1可以控制让用户重新输入用户名密码进行重新登录,一旦refresh_token过期了,走一遍退出流程,让用户重新登录(我感觉这样挺好,见过很多应用app也是,一个月登录就失效了)

Spring Cloud微服务安全实战_5-6_refresh token失效处理第3张

开始实验

1,客户端应用代码

直到上节为止,架构是这样的:在认证服务器登录成功后,客户端应用将认证服务器返回的token存到了自己的session,当调用微服务时,从session中拿出token,放在请求头。如果token已经过期了,就拿refresh_token去认证服务器刷新令牌,然后将新获取的token存到自己的session,并携带新的token去调用微服务。(如图1),刷新令牌失效会哪个地方发生?就在拿着refresh_token去刷新令牌的时候,refresh_token 可以也已经过期,此时就要捕获到这个异常,在刷新令牌的时候,发现refresh_token也过期了,就返回给前端一个500响应码和一个错误信息,前端拿到这个响应码,就去认证服务器走一遍退出流程,让用户彻底退出系统。

图1改造后的代码如下所示

Spring Cloud微服务安全实战_5-6_refresh token失效处理第4张

(图3)

2,表配置

在客户端应用里,将admin应用的token有效期设为10秒,refresh_token 有效期设为20秒。这样登录后10秒后,token就失效了,再调用订单服务,就会走上边说的刷新token代码,直到20秒后,刷新令牌也失效了,给前端一个错误码500和一个message,前端全局拦截这个错误,调用退出方法。

Spring Cloud微服务安全实战_5-6_refresh token失效处理第5张

3,前端代码

搞一个全局拦截器,拦截refresh_token失效的响应,因为调用任何服务,都可能返回这个错误响应。

这里使用jquery做的实验(我不会vue和angular),如果是vue获取angular等目前比较流行的框架,思路也是一样的。

Spring Cloud微服务安全实战_5-6_refresh token失效处理第6张

4,现象

启动几个微服务,登录后调用订单服务,正常

Spring Cloud微服务安全实战_5-6_refresh token失效处理第7张

token 10秒过期后,refresh_token起效了,刷新了令牌

Spring Cloud微服务安全实战_5-6_refresh token失效处理第8张

20秒后,调用订单服务,自动走退出流程,跳转admin应用的登录页

Spring Cloud微服务安全实战_5-6_refresh token失效处理第9张

如果refresh_token 失效,还想去认证服务器看看认证服务器的session失效没失效,那就在全局拦截出改成如下代码(我感觉这种体验并不好):

Spring Cloud微服务安全实战_5-6_refresh token失效处理第10张

本节github代码:https://github.com/lhy1234/springcloud-security/tree/chapt-5-6-refreshtoken-expired 写文章不易,如果对你有帮助了,给个小星星吧!

免责声明:文章转载自《Spring Cloud微服务安全实战_5-6_refresh token失效处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# chart控件基础使用mysql5.5升级至5.7 或升级至8.0下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot 2 要不要升级

目录 前言 一、SpringBoot 简史 二、SpringBoot 2 的变化 1.配置的变更 2.JDK 版本升级 3.第三方类库升级 4.响应式编程支持 5.Data 支持 6.Web加强 7.HTTP/2 支持 8.其他增强 三、要不要升级 前言 在谈SpringBoot 2.x 之前,先来聊点别的: 首先是Java 语言,这门长期...

9springboot处理Web静态资源

springboot处理Web静态资源 以前的JavaWeb/maven(war形式)项目都是把静态资源放在webapps/WebContent目录下,然后把JavaWeb项目打包成war包,那现在的springboot都是jar包形式,那么静态资源放在哪里? springboot通过WebMvcAutoConfiguration类可以知道默认的静态资源路...

django项目同一用户不能同时登陆

1、session认证 ..... login(request, user) #登录成功 # 登录之后获取获取最新的session_key session_key = request.session.session_key # 删除非当前用户session_key的记录 for session in Session.objects.filter(~Q(se...

Laravel Ajax的使用

Ajax (异步的 JavaScript 和 XML)是一套运用在客户端用来创建异步Web应用程序的Web开发技术。  在视图文件导入 jQuery 库使用 ajax来发送并从服务器接收数据。  在服务器端,您可以使用 response() 函数发送响应客户端,以及发送JSON格式的响应可以使用 JSON()函数来接收响应的数据。 json()函数语法 j...

C#通过Redis实现分布式锁

Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁。 活跃性A:没有死锁,即使客户端在持有锁的时候崩溃,最后也会有其他客户端能获得锁,超时机制。 活跃性B:故障容忍,只有大多数Redis节点时存活的,客户端仍可以获得锁和释放锁。 使用StackExchange.Redis 实现起来简单得很 s...

查看k8s中etcd数据

1.查看ETCD集群中运行的ETCD pod [root@master1 ~]# kubectl get pod -n kube-system | grep etcd etcd-master1 1/1 Running 0 61m etcd-master2...