Spring cloud微服务安全实战-5-9实现基于session的SSO(Token有效期)

token的有效期

会出现一种情况session有效期还没到。但是token过期了。
用户登陆着,但是token失效了 没法访问服务了。

刷新令牌要和clientId和ClientSecret一起用,发请求才有效。
那么刷新令牌在哪里?在数据库内 我们从来没有配置这个字段。
refresh_token_validity:刷新令牌的有效期。不配置就不会发refresh_token,

什么时候配置上了这个值,就会发refresh_token.这里配置一个 259200 ,30天的有效时间。


token放在请求头里面去获取数据,这里可能就会发生token过期的情况。

过期了我们就需要用refreshToken去刷新一下。

先来看一下过期的样子,这里我们设置为10秒,token的过期时间


把发出去的access_token清理掉。把这个表内的记录都删除掉, 


重启认证服务器和admin服务


因为我们的session还是有效的,可以登陆继续访问。但是我们的token信息已经没有了。 所以我会在数据库内生成一条心的token。这个token的有效期只有10秒。

刷新页面,不用登陆就进来了。 点击按钮 把获取order的信息也是可以的


数据库内多出一个token


用这个token去发请求

前两个请求都是成功的,到第三个请求,token已经过期。 再发请求就会报错。

写刷新令牌的代码

在这里判断令牌是否过期,过期就刷新令牌。



加一个过期时间的属性




我们把他改成long类型


过期时间就是当前时间,加上过期的秒数

有了这个时间 ,就可以判断 当前是不是过期了。
过期时间是不是在当前时间之前,是的话 就是过期了。


声明RestTemplate





init方法把自己当前对象返回回去。

有可能是还有几毫秒就过期了。拿到了这个token去访问 访问过程中可能就过期了。所以这里我们再减掉3秒。

声明TokenValue

执行newToken的init方法,及时初始化了新的过期时间。
最终把新的access_token放在请求头上。

callback回调这里修改

这里要init方法调用一下

Oauth加一个配置

指定userDetailsService

下面已经制定了authenticationManager了,上面为什么还要userDetailsService。这个userDetailsService是专门给refresh_token用的。 
我们其他的那四种授权模式,当你要认证用户的时候,都是用户名和密码一块对的,不管是授权码还是password,用户名和密码都会传过来。然后会用authenticationManager来验用户名密码。
因为下面这里。的 AuthenticationManagerBuilder这里把用户和密码都设置上了。


当我refresh_token的时候,是没有密码的,只有用户名,这时候我就只需要一个UserDetailsService来获取我的用户信息。↓所以下面这里要单独指定一个userDetailsService给refresh_token来用。

注入userDetailsService

数据库配置

让admin这个client支持 refresh_token 在授权类型这里加一个新的类型




测试

启动认证服务和admin的服务

session都删除了  所以需要重新登陆




多点击几次


大概没隔10秒 都会出现一个比较耗时的请求。这应该就是后台去刷新令牌了。


可以移植点下去 ,不会再报错了。因为refresh_token有效期很长,一个月。可以不断的用refresh_token来刷新令牌。
 

结束


 

猜你喜欢

转载自www.cnblogs.com/wangjunwei/p/11966240.html