正在使用SPA+Restful API开发一个网站,对于需要进行登录认证,遂采用JWT的token方式。
根据JWT的流程,当用户使用用户名密码登录成功后,服务端会生成一个唯一的token返回给客户端,客户端存储在Cookie或者Storage中,用户在以后的请求中都带上这个token,服务器进行token的合法性验证,是否已过期等等,从而返回不同的结果。
但有几点疑惑:
1、当用户注销时(并为到达过期时间),该如何处理?删除本地存储的token?
2、如何延续token的有效性,当一个用户登录后,并长时间操作,这个时间超过了token的expires,难道告诉用户再登录一次,显然不行。在每次请求中都检测token的过期时间,在将要过期的时候(小于1分钟)更新token?那恰好错过了这一分钟怎么办?在每一次的请求后,都对token进行更新,返回客户端吗?那服务端将不停的计算操作和客户端将不停的存储操作。该如何处理?
这个问题在https://segmentfault.com/q/1010000003692779已提出,但并没有得到很好的回答,遂再提一次。
我的做法是这样的:
在拦截器中每次校验token的过期时间,如果token快要过期(设置一个合理的时间,防止页面多个ajax请求导致现有token过期,比如三分钟。此处我个人猜测跟微信的那个token类似,就是每次你获取新的token后,旧的的token还有一定的缓冲期),则颁发新的token。
前端我这边用的angularJs,前端http拦截器中获取每次检测是否颁发了新的token,如果颁发了的话,则替换旧的。
检测token时间过期比较简单,后端代码就不放了
前端代码如下: