我正在使用django rest框架开发网站,django rest框架jwt用于后端和next.js,反应,redux用于前端。
假设
将访问令牌存储为cookie,而不是localStorage。因为我正在使用Next.js,并且想在初始渲染之前获取访问令牌。
用户登录时,后端将访问令牌作为cookie发送
访问令牌到期和刷新如下所示
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_COOKIE': 'token'
基于上面,我有几个问题。
访问令牌将在5分钟后过期。在5分钟内,用户可以请求具有permission_classes = (IsAuthenticated,)
和访问令牌的页面。如果5分钟过去了,cookies(访问令牌)将自动消失,用户需要再次登录。为避免这种情况,有刷新令牌的系统,对吗?
如果正确,何时和如何刷新令牌是正确的?
在请求使用访问令牌的后端之前,请始终将访问令牌的到期时间与当前时间进行比较,如果它即将过期,则停止请求一次,先切换到使用axios刷新令牌,获取新令牌后,重新启动使用新令牌的请求。 。
是正确的方法吗?
因为它是饼干,对不对?例如,用户登录后离开计算机10分钟。用户回来尝试访问网站,但他需要再次登录。因为cookie中没有更多访问令牌,所以也无法刷新令牌。我该怎么办?
我希望用户不要尝试多次登录并保持用户登录,直到刷新令牌过期为止。
答案 0 :(得分:1)
您可以使用“拦截器”概念,例如axios拥有它,可以添加响应拦截器,并且如果服务器返回特殊错误(“ token_expired”),则该拦截器将访问refresh-token
带有刷新令牌的api,获取一个新的访问令牌,然后重试上一个失败的请求。
在此处签出第一个答案:https://github.com/axios/axios/issues/934#issuecomment-322003342
希望这很清楚。