首页 > 解决方案 > 正确实现 JWT

问题描述

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

有了这个假设,

'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(访问令牌)将自动消失,用户需要重新登录。为了避免这种情况,有刷新令牌的系统,对吧?如果正确,何时以及如何刷新令牌是正确的?用accesstoken向后端请求之前,总是比较accesstoken的过期时间和当前时间,如果快过期了,就停止一次请求,先用axios切换到刷新token,拿到新token后,重新用新token请求。 . 是正确的方式吗?

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

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

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

标签: reactjsdjango-rest-frameworkjwt

解决方案


可以使用“拦截器”的概念,比如axios就有,可以添加响应拦截器,如果服务端返回特殊错误(“token_expired”),那么该拦截器会使用refresh-tokenrefresh-token访问api它有,获取一个新的访问令牌并重试最后一个失败的请求。

在这里查看第一个答案:https ://github.com/axios/axios/issues/934#issuecomment-322003342

希望这很清楚。


推荐阅读