token失效自动刷新

1,303 阅读2分钟

前言

 在开发过程中,我们都会接触到token(令牌),为什么要用token呢?主要的作用就是为了安全,用户登录时,服务器会返回一个有时效性的token,用户的每一次请求都需要携带上token,服务器会验证token的有效性。

需求

 在用户登录后给前端发送一个token,并且有效期为72个小时。当token失效时:

  1. 用户处于非活跃状态(关闭浏览器),当用户再次访问网站时,需要重新登录。

  2. 用户处于活跃状态,重新刷新token。

  3. 当重新刷新过token后并且在用户关闭浏览器后重新访问网站时,需要重新登录(对于这个点不知道是否符合真实需求)。

设计方案1

 在用户登录时服务器返回token,然后前端保存下来。在每次调用接口时带上token。但这种设计会出现问题,比如用户在token将要失效时访问网站,过几分钟token失效后跳转回登录页面,这将带来非常糟糕的体验。不符合需求。

设计方案2

 在用户登录时服务器返回token和refreshToken。在每次调用接口时带上token。这时如果token失效服务器会返回一个状态code,告知前端token已经失效,前端收到消息后将使用refreshToken请求服务器重新获取token与refreshToken。如果refreshToken也失效,将跳转至登录页面。那token的有效时长和refreshToken的有效时长如何设置比较好呢?

 假设token = 60,refreshToken = 72(单位:小时),这样用户在登录后的72个小时内会话有效。且可以刷新token的时区为[60,72](12个小时缓冲区)。这时分两种情况:①[60,72]区间内用户无任何操作,那么本次登录将失效,再次访问网站时需要重新登录。②[60,72]区间内用户有操作,因为此时token已经失效服务器会重新返回token和refreshToken,相当于重新登录,此时会话有效期为72个小时。

 这种设计方案满足需求第一点和第二点,对于第三点还未解决。

代码参考GitHub