有关Web的安全验证与鉴权,Jwt已然成为我们日常开发中最常用的方案,这里的Web既包括各种Web系统和平台,还有各种对外提供的API服务等等。它们都可以用jwt的方案来对客户端请求进行安全验证。但是一般人都知道,token存在一个过期的问题,它会导致我们正在使用系统的过程中,出现突然中断你的使用,让你去重新登录,使得正在进行或者进行到半途的工作瞬间作废,这真的是很糟糕的体验,于是就有了适当的时候怎么样对过期token进行更新的需要。
按照以往的传统思路,在请求token的时候返回给客户端两个token,一个是正常鉴权用叫token,另一个是用来刷新token用的叫refreshtoken;一般这个refreshtoken时效性会比鉴权token要长,一旦鉴权token过期,可以用refreshtoken去重新获取新的token。其实这种方案也会有不友好体验的时候,并不能做到真正的无感。比如我前端页面发起一个页面查询,发现token过期,这时就要利用refreshtoken单独请求接口获取新的token,显然此次页面的查询操作就会被中断,可能需要你重新手动点击一次查询操作,这对用户来说,体验上显然是不友好的,虽然这种情况可能不是很频繁。有些人或许会说,我可以在代码里面补充逻辑,遇到这种情况可以再自动发起一次请求,逻辑上看似乎没问题,但是你想想,以后每个客户端请求方法里面都要加这一段判断逻辑,对开发工作而言又是一笔得不偿失的大负担了。
那有没有其他法子,既能解决token过期问题,又不存在丝毫请求卡壳,做到真真正正的无感刷新呢?让我们接着往下看…
新方案的思路和原理其实很简单,在实施过程中只要关注到两点就能做到真真正正的无感刷新,而且这种方案通过扩展还能对token的有效性做到实时控制。
第一点就是需要我们自己实现一个全局拦截器,在拦截器逻辑中,自己实现token的解析和验证。
第二点就是在解析验证token时,判断这个token距离过期还有多久,比如token的有效期是60分钟,当发现距离过期少于20分钟或者少于10分钟(这个时间长短根据自身需求定),我们就可以在返回请求的头部添加一个新的token给到客户端,客户端在拿到新token后替换掉老token,这样token的有效期就能够持续自动的更新,在我们使用系统过程中,只要中间不出现长时间不用的情况,token会始终有效,用户也不会感觉到任何的卡壳,真正做到了无感刷新。
同时还可以在此方案的基础上,进行适当的扩展,来达到对token有效性的即时控制。比如我禁用了某个用户,那么就可以根据token中的userid立马让这个用户的token失效,真可谓是一举多得的好法子!