【问题标题】:How can I prevent the usage of old flask-jwt token when I change the password更改密码时如何防止使用旧的flask-jwt令牌
【发布时间】:2016-03-03 21:34:11
【问题描述】:

我是使用 JWT 和 flask-jwt 的新手。我在我的项目中实现了 flash-jwt。即使我更改了用户密码,从 flask-jwt 收到的访问令牌也不会过期。那么如何防止使用旧的flask-jwt令牌。

【问题讨论】:

  • 通过将所有生成的令牌保存在我们的数据库中解决了这个问题。

标签: flask jwt flask-security flask-jwt


【解决方案1】:

这是使用无状态 JWT 令牌的一个缺点 - 您不能显式撤销它们。

相应的优点是您不必联系外部服务来验证它们。

【讨论】:

  • 我们无法显式撤销 flask-jwt 令牌。没关系。那我该如何防止这种情况。我不明白第二行。
  • 联系你的资源服务器时,它可能会验证令牌本身的有效性,而无需联系其他服务器进行验证。对于非 JWT 访问令牌(通常只是一个随机字符串),您必须调用发布服务器来验证它。这是相对昂贵的。
【解决方案2】:

我们可以通过将所有令牌存储在我们的数据库中来构建一个额外的安全层。在验证令牌时,我们可以检查这个令牌是由我们的服务器本身生成的,还是不是使用这个数据库表生成的。我们也可以在用户重置他的密码撤销令牌,只需从数据库中删除该令牌

【讨论】:

    【解决方案3】:

    请务必记住,(无状态)JWT 令牌仅在过期或用于签署它们的共享密钥发生更改时才会失效。

    所以基本上,选择是:

    • 如@savad-kp 建议的那样,使用数据库 来保留列入黑名单/已撤销令牌的列表:这意味着您每次验证令牌时都必须查询它,哪种类型破坏了使用 JWT 令牌的主要好处之一。
    • 依赖短期访问令牌:这意味着客户端需要经常重新进行身份验证,这对于移动设备和网络应用程序来说可能是一个不可行选项.
    • 使用token freshness pattern 或其他一些自定义变体:

    [...] 您可以选择将一些访问令牌标记为新鲜,而将其他令牌标记为非新鲜,并使用fresh_jwt_required 装饰器仅允许新鲜令牌访问某些端点。

    这对于允许新令牌执行某些关键操作(可能更改密码或完成在线购买)很有用,但对非新令牌拒绝这些功能(直到他们重新验证并获得新令牌) )。新鲜的令牌可以带来更安全的网站,而不会因为让用户一直重新进行身份验证而造成糟糕的用户体验。

    我还建议使用 flask-jwt-extended 插件而不是 flask-jwt 插件。它支持一些开箱即用的常见模式(刷新令牌、令牌新鲜度)以及使用 db 的黑名单和令牌撤销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 2018-03-12
      • 2020-01-28
      • 2020-03-27
      • 2020-05-13
      • 2015-01-02
      • 2019-08-09
      • 2022-10-05
      相关资源
      最近更新 更多