我按照 Brad Traversy (https://www.youtube.com/watch?v=0d7cIfiydAc) 的教程,使用 Knox 进行身份验证并使用 React/Redux 作为前端,开发了带有令牌身份验证的基于 Django 的 Web 应用程序。登录/注销工作正常(这是 Brad 的代码:https://github.com/bradtraversy/lead_manager_react_django/blob/master/leadmanager/frontend/src/actions/auth.js --> 使用 POST 请求注销),除此之外还有一个问题:当用户长时间远离计算机时,令牌会同时过期。因此,当用户返回时,他们仍然处于网站的登录区域中,但是一旦他们打开一个从数据库加载数据的 React 组件,控制台就会抛出 401 错误(“无法加载资源:服务器响应状态为 401(未经授权)”)。然后用户必须继续“注销”并再次登录。
这不是最优的,我更希望用户返回后,系统意识到令牌过期并自动注销用户。我想到了以下方法,但我不确定如何实施或哪一种最好:
对于每个 API 请求:如果答案是 401 --> 注销(这也可能会在令牌尚未过期的情况下注销用户,但如果存在其他权限问题)- 对我来说似乎不是最佳选择。
相反,人们也可以创建一条测试路线,例如api/auth/check 使用 Django 视图,包括典型的检查
permission_classes = [permissions.IsAuthenticated]
如果返回 401 --> 注销。因此,这意味着对于每个数据库请求,我之前都有另一个相当不特定的数据库请求。
我很高兴收到有关如何最好地实施这一点的建议!
这可以通过多种方式完成。 我不明白自动踢出用户的原因,但如果你想这样做,你可以:
Jazzy 的答案 - 选项 3 - 给我带来了正确的方法(谢谢!),但是在前端使用计时器最初并不成功,因为在 React 组件中启动计时器只会在该组件运行时运行可见的。我没有在用户会话期间始终可见的组件。我将 Django 设置中令牌的过期时间从默认值 8 小时更改为 72 小时,并使用此包在前端实现了空闲检查:https://www.npmjs.com/package/react-idle-timer 。因此,一旦我的应用程序 2 小时未使用,我就会调用注销操作 (api/auth/logout)。通过这种方法,我不需要关心 Django 端令牌的过期时间,因为没有用户在 72 小时内处于活动状态。一旦他再次登录,他就会收到一个新的令牌。
新解决方案: 我决定不再频繁地打扰用户登录,并发现了这个不错的策略:
if 'some_session_variable' in request.session:
# whatever logic you need
else:
return HttpResponse("logout")
由于会话变量在到期后将不可用,因此返回“注销”字符串。在前端,我们检查每个响应中的“注销”字符串。如果它被返回,我们将启动注销过程。空闲计时器不再使用(因为根据我的经验,它不太可靠)。