reactjs - 正确实现 JWT
问题描述
我正在使用 django rest 框架开发网站,django rest framework jwt 用于后端和 next.js,react,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(访问令牌)将自动消失,用户需要重新登录。为了避免这种情况,有刷新令牌的系统,对吧?如果正确,何时以及如何刷新令牌是正确的?用accesstoken向后端请求之前,总是比较accesstoken的过期时间和当前时间,如果快过期了,就停止一次请求,先用axios切换到刷新token,拿到新token后,重新用新token请求。 . 是正确的方式吗?
- 如果访问令牌已过期,它将消失
因为它是饼干,对吧?例如,用户登录并离开计算机 10 分钟后。用户回来尝试查看网站,但他需要重新登录。因为 cookie 中没有更多的访问令牌,也无法刷新令牌。我应该怎么办?
我希望用户不要多次尝试登录并保持用户登录状态,直到刷新令牌过期。
解决方案
可以使用“拦截器”的概念,比如axios就有,可以添加响应拦截器,如果服务端返回特殊错误(“token_expired”),那么该拦截器会使用refresh-token
refresh-token访问api它有,获取一个新的访问令牌并重试最后一个失败的请求。
在这里查看第一个答案:https ://github.com/axios/axios/issues/934#issuecomment-322003342
希望这很清楚。
推荐阅读
- jasper-reports - 如何计算页面详细信息带跨越的数量?
- azure - 执行重试逻辑后显示角色分配已存在错误
- r - 如何通过从复选框组中选择状态以交互方式并排从 UI 绘制图形?
- java - 创建没有实体的spring存储库
- javascript - 如何使用 !不混淆?
- sql-server - 新手:为 SQL Server 2017 创建 dockerfile
- c++ - 了解获取非静态成员地址以形成指向成员函数的指针的错误?
- javascript - 如何使滚动到顶部的动作更流畅
- r - R中是否有一个函数允许选择行名以小写字母结尾的行并删除该字母?
- typescript - OR 运算符如何在 javascript 或 typescript 中查找函数?