双Token实现无感刷新登录状态

发布时间 2023-12-08 15:17:42作者: 奥托

基于access_token和refresh_token实现无感刷新登录状态

双token原理

 
这是登录认证的流程:

验证通过之后,将用户信息放到jwt中。

 
访问接口的时候带上jwt,在Guard里取出来判断是否有效,jwt有效的话才能继续访问:

这种方式有个问题:
jwt是有有效期的,我们设置的是7天,实际上为了安全考虑会设置的很短,比如30分钟。
可能用户正在访问某个界面的时候,jwt突然失效了,必须重新登录。
体验比较差。

 
为了解决这个问题,服务端一般返回两个token:access_tokenrefresh_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