前言

    当前有相关业务,但由于觉得没有必要开着长链接,遂不使用WebSocket,但这时候需要处理用户角色权限发生变化的情况,同时对JWT滑动过期造成了一定的影响:没有WebSocket的情况下,无法通知前端用户的角色发生了变化。并且由于JWT是无状态的,所以在用户角色权限发生变化的时候,只能生成新的JWT。此时只能在各个关键节点调用RefreshToken的接口去获得新的Token,以此保证用户的Token是最新的。

问题描述

    但上述的情况会衍生出两个问题和一个需优化的情况

  • 问题1:由于在多处需要调用RefreshToken这个接口,假设前端在调用该接口时,担心用户体验的问题,未对其余请求进行阻塞,而会使用旧的Token去请求其他接口的时候。有可能会因为Token过期或者用户角色权限发生变更导致出现401或403的情况。
  • 问题2:此时怎么让用户的JWT过期时间滑动起来呢?
  • 待优化:同样由于在多处需要调用RefreshToken这个接口,假设用户的角色权限没有发生变化,Token也没有过期,是否不需要给出新的Token。

    针对上述问题1,思虑再三,在不做阻塞请求的情况下,无法规避401的情况,只能将401发生的概率降低。

解决方法

    于是,做了以下处理:

  • 1、在调用刷新Token的接口时解析Token获取过期时间、用户角色
  • 2、获取用户缓存得到用户当前的角色假设Token在两小时内过期,或者缓存中用户的角色与JWT中解析得到的角色不一致,则返回出新的Token,否则沿用原先的Token。大大降低了在不做阻塞请求的情况下,发生401以及403情况的概率。同时在各节点的触发相应的解决了问题2,以及上述待优化的情况。