基于access_token和refresh_token实现无感刷新登录状态
双token原理
这是登录认证的流程:
验证通过之后,将用户信息放到jwt
中。
访问接口的时候带上jwt
,在Guard里取出来判断是否有效,jwt
有效的话才能继续访问:
这种方式有个问题:
jwt
是有有效期的,我们设置的是7天,实际上为了安全考虑会设置的很短,比如30分钟。
可能用户正在访问某个界面的时候,jwt
突然失效了,必须重新登录。
体验比较差。
为了解决这个问题,服务端一般返回两个token:access_token
和refresh_token
access_token
是用来认证身份的,之前我们返回的就是这个token
refresh_token
是用来刷新token的
服务端会返回新的 access_token和refresh_token,也就是这样的流程:
登录成功后,返回两个token:
access_token
用来做登录权限:
而refresh_token
用来刷新,拿到新的token:
access_token
设置为30分钟过期,而refresh_token
设置7天过期。
这样7天内,如果access_token
过期了,那就可以用refresh_token
来刷新下,拿到新的token
只要不超过七天内未访问系统,那就可以一直是登录状态,可以无限续签,不需要登录。
如果超过七天内未访问系统,那么refresh_token
也就过期了,这时候需要重新登录了。
这也是一般App采用的双token验证。
nest.js中的双token实现
创建一个nest项目:
nest new access_token_and_refresh_token -p npm