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

    结束


     

  • 相关阅读:
    Java 深拷贝和浅拷贝 利用序列化实现深拷贝
    算法题005 剑指Offer面试题29 数组中出现次数超过一半的数字
    算法题003 斐波那契(Fibonacci)数列
    Android Sensors (4) 传感器使用最佳实践
    Android WebView使用基础
    Java 多线程(八) 线程状态图
    算法题006 判断两个链表是否相交
    Java 多线程(五) 多线程的同步
    算法题001 剑指Offer 面试题三:二维数组中的查找
    Android绘制基础及手写绘制实例
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/11966240.html
Copyright © 2020-2023  润新知