【问题标题】:Django SimpleJWT: Some questions with token authenticationDjango SimpleJWT:关于令牌认证的一些问题
【发布时间】:2022-01-13 04:14:53
【问题描述】:

我正在使用SimpleJWT 在 Django 中实现身份验证,并且对此有一些疑问。为了提供一些背景信息,我的后端有多个域,一些使用普通登录(用户名和密码),还有一些使用 SSO 登录。

问题 2: 假设我将访问令牌存储在本地存储中并将访问令牌发送到所有 API,并且我还在它过期之前对其进行刷新。但是如果用户关闭浏览器,我们无法刷新访问令牌,会发生什么情况。访问令牌过期并且用户被注销。我们如何才能让用户在一定时间内(比如 30 天)保持登录状态?

【问题讨论】:

  • 这应该分成三个独立的问题。否则太宽泛了。
  • 我只保留问题 2。

标签: django security access-token refresh-token django-rest-framework-simplejwt


【解决方案1】:

当访问令牌过期时,您使用刷新令牌获取新的访问令牌。

之所以有效,是因为刷新令牌的生命周期很长,通常长达 30 天(但如果您愿意,可以更长)。

例子:

  • 用户关闭浏览器
  • 10 天后回来
  • 用户向服务器发送请求
  • 服务器将返回 401 Unauthorized 响应,因为访问令牌已过期
  • 您的应用将发送请求以使用刷新令牌获取新的访问令牌
  • 如果刷新令牌有效,服务器将返回一个新的访问令牌
  • 如果刷新令牌过期,服务器将返回 401 响应。这意味着用户需要重新登录。

安全注意事项

就我个人而言,我认为 JWT 对于大多数网络应用程序来说不是一个合适的想法,因为关于如何安全地存储令牌的意见和建议存在冲突。

由于刷新令牌非常强大,因此不建议将其存储在浏览器中。 那么你将它存储在哪里?这就是这种由 JWT 提供支持的“无后端”网络服务的误导性想法开始分崩离析的时候。

关于存储代币的悖论:

  1. 将其存储在本地存储中:容易受到 XSS 攻击。
    这真的很严重,因为 XSS 漏洞也可能来自第三方 JS 库,而不仅仅是来自您自己的代码。 Hackers can hijack a third-party library on NPM to inject malicious code 并且您可能在您的项目中不知不觉地使用了它(它可能是另一个依赖项的依赖项的依赖项......)。

  2. 将其存储在 httponly cookie 中:免受 XSS 攻击,但需要第一方后端服务器(因为第三方身份验证服务器无法为其他域设置 cookie)。
    如果你停下来想一想,你会注意到这种情况与常规会话身份验证完全相同,其中会话令牌保存在 cookie 中。那么为什么不直接使用 session auth 而不是这个复杂的 JWT 设置呢?

我将建议您彻底研究这一点,并确定您的网络应用是否真的需要 JWT。


使用跨域 cookie 的 JWT 身份验证

由于您提到您的前端应用程序连接到另一个域中的 API 服务器,因此使用 JWT 似乎没问题。

如果您控制 API 服务器,您可以设置 CORS headers 以允许 API 服务器在您应用的域上设置 cookie。

重要提示:
由于这涉及到 Cookie,因此很容易受到 CSRF 攻击。但是 > 这更容易防止使用 CSRF 令牌。 这意味着,对于每个 POST 请求,您都需要发送 CSRF 令牌 并且 API 服务器还必须验证该 CSRF 令牌

这是我在这种情况下制作的身份验证流程图:

【讨论】:

  • 你能推荐一些替代品吗,我是这个领域的新手?
  • @AmanSharma 您的应用是否向自己的域(即 domain-1.com --> api.domain-1.comdomian-2.com --> api.domain-2.com)发出 api 请求。还是您的所有应用都向另一个域(即domain-1.com --> api.common.com)发出请求?
  • 我的所有应用都向另一个域发出请求。
  • @AmanSharma 我已经更新了答案。请看一看。
【解决方案2】:

对于问题 2,将此代码添加到您的 settings.py 文件中

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2023-02-02
    • 2015-10-07
    • 2021-12-24
    • 2017-10-29
    • 2020-10-24
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多