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来刷新令牌。
结束