正确实施JWT

时间:2019-02-17 15:46:08

标签: reactjs django-rest-framework jwt

我正在使用django rest框架开发网站,django rest框架jwt用于后端和next.js,反应,redux用于前端。

假设

  • 将访问令牌存储为cookie,而不是localStorage。因为我正在使用Next.js,并且想在初始渲染之前获取访问令牌。

  • JWT与Django REST framework JWT Search GitHub

  • 用户登录时,后端将访问令牌作为cookie发送

  • 访问令牌到期和刷新如下所示

'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_COOKIE': 'token'

基于上面,我有几个问题。

  1. 何时以及如何刷新令牌

访问令牌将在5分钟后过期。在5分钟内,用户可以请求具有permission_classes = (IsAuthenticated,)和访问令牌的页面。如果5分钟过去了,cookies(访问令牌)将自动消失,用户需要再次登录。为避免这种情况,有刷新令牌的系统,对吗? 如果正确,何时和如何刷新令牌是正确的? 在请求使用访问令牌的后端之前,请始终将访问令牌的到期时间与当前时间进行比较,如果它即将过期,则停止请求一次,先切换到使用axios刷新令牌,获取新令牌后,重新启动使用新令牌的请求。 。 是正确的方法吗?

  1. 访问令牌如果已过期将消失

因为它是饼干,对不对?例如,用户登录后离开计算机10分钟。用户回来尝试访问网站,但他需要再次登录。因为cookie中没有更多访问令牌,所以也无法刷新令牌。我该怎么办?

我希望用户不要尝试多次登录并保持用户登录,直到刷新令牌过期为止。

1 个答案:

答案 0 :(得分:1)

您可以使用“拦截器”概念,例如axios拥有它,可以添加响应拦截器,并且如果服务器返回特殊错误(“ token_expired”),则该拦截器将访问refresh-token带有刷新令牌的api,获取一个新的访问令牌,然后重试上一个失败的请求。

在此处签出第一个答案:https://github.com/axios/axios/issues/934#issuecomment-322003342

希望这很清楚。