正确实现 JWT
Posted
技术标签:
【中文标题】正确实现 JWT【英文标题】:Implementation of JWT correctly 【发布时间】:2019-07-11 02:30:50 【问题描述】:我正在使用 django rest 框架开发网站,django rest 框架 jwt 用于后端和 next.js,react,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'
基于以上,我有几个问题。
-
何时以及如何刷新令牌
访问令牌将在 5 分钟后过期。在 5 分钟内,用户可以使用访问令牌请求具有permission_classes = (IsAuthenticated,)
的页面。如果 5 分钟过去了,cookie(访问令牌)将自动消失,用户需要重新登录。为了避免这种情况,有刷新令牌的系统,对吧?
如果正确,何时以及如何刷新令牌是正确的?
用accesstoken向后端请求之前,总是比较accesstoken的过期时间和当前时间,如果快过期了,就停止一次请求,先用axios切换到刷新token,拿到新token后,重新用新token请求。 .
方法对吗?
-
访问令牌过期后会消失
因为它是 cookie,对吧?例如,用户登录并离开计算机 10 分钟后。用户回来尝试查看网站,但他需要重新登录。因为 cookie 中没有更多的访问令牌,也无法刷新令牌。我该怎么办?
我希望用户不要多次尝试登录并保持用户登录状态直到刷新令牌过期。
【问题讨论】:
【参考方案1】:可以使用“拦截器”的概念,比如axios有,可以添加响应拦截器,如果服务器返回特殊错误(“token_expired”),那么该拦截器会访问@987654323 @api 及其拥有的刷新令牌,获取新的访问令牌并重试最后一个失败的请求。
在这里查看第一个答案:https://github.com/axios/axios/issues/934#issuecomment-322003342
希望这很清楚。
【讨论】:
以上是关于正确实现 JWT的主要内容,如果未能解决你的问题,请参考以下文章
JWT 实现登录认证 + Token 自动续期方案,这才是正确的使用姿势!