这节我们继续讲Token的刷新和主动踢人下线。
图片
首先Token为啥刷新呢?很简单为了安全性用户AccessToken的时效性会相对较短,保证Token被其他恶意用户拿到后也不能长时间用它来浏览用户的数据。
即然有效期短那就得有合理的方式让用户的Token能够被刷新,不然用户使用产品期间隔一段时间就得登录一次,一天登录好几次,用户体验可想而知,定是不会好的。
为什么要有刷新Token
在我们的用户认证体系中,当用户登录成功后,在服务端存储以下的Token信息和用户会话信息。
图片
这里我们设计了两种Token:AccessToken以及RefreshToken,AccessToken专门用户来接口请求中验证请求的用户身份,我们上面说过为了安全考虑它的时效比较短一般 0.5h ~ 2h,到期后客户端可以用RefreshToken来刷新获得新的Token信息。
RefreshToken的时效一般设的较长10 ~ 30天都可以,假设用户首次登录后过了几天再来使用应用,客户端仍能通过RefreshToken来刷新Token信息,用户在短期未使用产品的情况下仍能保持住登录态,不至于出现隔几天再用每次都得重新登录的情况。
所以两个Token,AccessToken 时效短,RefreshToken 时效长,两者结合,在安全性和用户体验上都有一定保证。
在上节用户 Token 的派发、存储和认证开发的功能中,项目的用户登录系统时,服务端存储了上述Token和会话信息后会向客户端下发以下图示中的Token字段。
图片
除了上面这张用户登录的情况,当客户端进行Token信息的刷新时,这些Token字段也会更新并返回给客户端,也就是说刷新Token信息后除了AccessToken会更新外,RefreshToken也会刷新,用户登录态的可保持时间又往后延长了一个新的周期。与此同时旧的RefreshToken我们并不会直接删,而是设置延迟几个小时删除,为什么这么做呢?后面告诉你答案。我们先看一下Token刷新逻辑的实现。
Token刷新逻辑实现
我用下面这个顺序图说明了整个Token刷新的逻辑。
图片
大家把这张图中描述的Token刷新逻辑好好地看一下,通过这张图可以看出来,刷新逻辑与生成逻辑只有两处不一样:
总结
本节的代码版本号为c11,加入项目后访问 https://github.com/go-study-lab/go-mall/compare/c10...c11 能看本章节的详细代码。
Token的主要逻辑到这里就开发完成了,接下来我们把它接入到用户登录的流程中去,另外现在的Token体系还不够完善,因为对于用户登出、重置密码等需要主动过期Token和清除Session的逻辑我们还没有覆盖到,这些我们会在接下来的几节中开发相应的功能时再去完善。