OAuth2.0刷新Token,正在操作时,Token不过期

文件名称版本号作者qq版本
OAuth2.0刷新Tokenv1.0.0学生宫布8416837SpringBoot 2.2.6
SpringCloud Hoxton.SR4

需求

  • 保证页面不会在正在操作中却弹出Token过期,这样体验不好。除非好久(设定的阈值)没有操作页面了,显示已过期才合理。

假设你已经搭建好OAuth2.0服务器

  • 登录(授权)成功后,响应数据长这个样子: 在这里插入图片描述
名词释义备注
access_token作为消费服务的通行证,逾期会失效
refresh_token用来换取新的access_token,会失效,但一般应该设置比access_token晚些失效
expires_in多久过期(秒)可在数据库设置或者在令牌管理器代码设置
  • 但如果正在操作中,令牌(通行证)突然到期失效了,那多尴尬
  • 因此需要在即将过期或已经过期的时候,刷新Token。——前提是refresh_token没有过期且合法。

解决办法

  • 前提:可以成功获取Token,并成功在客户端维护Token、过期时间
1)定时器
  • 原理 计算Token过期的时间点,开始计时,当当前时间点接近过期点的时候,执行刷新Token操作。要保证每个页面都可能触发计时器,且只能有一个,当页面刷新时,计时器不受影响。
  • 代码 节选
// 从存储获取过期时间
computed: mapGetters(['userInfo', 'isLock', 'isCollapse', 'website', 'expires_in']),
... ...
// 这里是aJax请求拦截器
// 如果即将过期,则调用刷新API,参数是refresh_token, grant_type:授权类型,即refresh_token, scope;并锁住刷新接口
          if (this.expires_in <= 1000 && !this.refreshLock) {
            this.refreshLock = true
            this.$store
              .dispatch('RefreshToken')
              .catch(() => {
                clearInterval(this.refreshTime)
              });
              
            this.refreshLock = false
          }
          // expires_in递减
          this.$store.commit("SET_EXPIRES_IN", this.expires_in - 10);
... ...

this.$store.dispatch('RefreshToken'):调用刷新 API

2)请求拦截式,每次请求权限接口都判断是否可以刷新Token了
  • 代码 节选
// 这里是aJax请求拦截器
window.isRefreshing = false
... ...
 // futureTime:Token在将来某个时间点过期
  if (!window.isRefreshing && futureTime && (futureTime - new Date().getTime() ) <= EXPIRED_IN_THIS_SECONDS ) { // 如果expires_in_time eq 0,则很可能是初次登陆,从而勿须刷新令牌 假如设置还差6秒过期
    // 锁 避免多个调用重复刷新
    window.isRefreshing = true
    // 刷新Token

如果同时调用多个接口,而此时Token已经过期,但refresh_token没有过期的话,最先刷新的接口可以执行成功,另外的接口不会刷新,会导致请求失败。但是之后会正常,因为已经刷新了。见下图:

Mon 06 Mon 13 请求1刷新中 请求路上 请求3请求中,但是木有Token 请求2 时序图

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OAuth2.0配置token的步骤可以通过以下方式实现。首先,你可以使用Spring Security OAuth2来实现。在Java中,可以通过引入Spring Security OAuth2的依赖来使用。然后,需要在你的应用程序配置文件中添加相关的OAuth2.0配置,包括授权服务器的URL、客户端ID和客户端秘钥等信息。通过配置这些信息,你的应用程序可以与授权服务器进行通信,并获取访问令牌。 在使用HttpClient客户端调用Web API接口,如果API使用OAuth2.0权限控制,你需要在调用接口之前获取访问令牌进行认证。你可以通过向授权服务器发送认证请求来获取访问令牌,这通常涉及到向授权服务器提供你的客户端ID、客户端秘钥、授权类型等信息。一旦获得了访问令牌,你可以将其包含在HTTP请求的头部或参数中,以便API能够验证你的请求并授予访问权限。 另外,在实现OAuth2.0token刷新功能方面,你可以通过编写过滤器来实现。在过滤器中,你可以检查访问令牌的过期间,并在过期前进行刷新刷新访问令牌的过程,通常涉及向授权服务器发送刷新请求,并提供刷新令牌以获取新的访问令牌。一旦获得了新的访问令牌,你可以更新原有的访问令牌并继续进行API调用。 需要注意的是,具体的OAuth2.0配置和实现方式可能因不同的框架或库而有所差异。因此,你需要根据你所使用的具体工具和技术来查阅相关文档并进行相应的配置和实现。希望以上信息能对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Oauth2.0实现token刷新功能](https://blog.csdn.net/qq_41157896/article/details/118697419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [winform调用webapi获取Token授权案例,webapi使用oauth2.0权限控制](https://download.csdn.net/download/gc101312/82935655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Oauth2.0实现token刷新功能(二)](https://blog.csdn.net/qq_41157896/article/details/124351822)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值