【问题标题】:How to correctly store JWT Refresh Tokens in a database?如何在数据库中正确存储 JWT 刷新令牌?
【发布时间】:2021-09-23 20:49:37
【问题描述】:

我一直在使用 Flask 和 JWT 在我的后端创建身份验证。创建和使用访问令牌非常简单,但是在尝试了解如何处理刷新令牌的使用和存储时,我遇到了一些概念上的误解。

在初次登录时,我会分发一个访问令牌(有效期为 10 分钟)和一个刷新令牌(有效期为 4 天)。刷新令牌的“jti”属性及其到期日期存储在数据库的表中。访问令牌存储在内存中,刷新令牌存储在 HttpOnly cookie 中。当访问令牌过期时,会使用刷新令牌向后端发送“静默刷新”。首先检查其有效性(用户 ID 匹配、签名正确且未过期),然后检查数据库是否包含该特定刷新令牌的“jti”。如果是,则从数据库中删除该刷新令牌(因此不能再使用),并将新的访问令牌和刷新令牌发送给用户。这允许刷新令牌仅用于单次使用。但是,如果用户反复注销并重新登录,他们浏览器中的刷新令牌 cookie 会不断被新值覆盖(这很好),但数据库现在包含大量对“未使用”刷新令牌的引用。我不确定我对 JWT 工作流程的理解是否完全错误,或者这是否正常。

我主要在概念上遵循this guide。这种重复登录并获得刷新令牌是否正常?我看不到如何手动查找和删除在同一浏览器中使用的旧(但仍然有效)令牌。

【问题讨论】:

    标签: authentication flask jwt


    【解决方案1】:

    您的实现看起来不错。您为新会话发行新令牌是正常的。我认为您的问题有两种解决方案:

    1. 使用刷新令牌将expiration 列添加到您的表中。然后,一旦过期,您就可以从表中删除陈旧的 jtis。

    2. 您可以保留有关已使用的刷新令牌的信息,而不是保留有关已发布的刷新令牌的信息。因此,当您发出令牌时,您不会将其保存在数据库中。用户使用RT时,可以将jti和expiration保存在DB中。每当使用 RT 时,您都会检查 jti 是否在数据库中。如果是,您拒绝该请求。您可以在过期后从该表中删除条目,因为无论如何您都会在 RT 上验证过期。

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2017-10-12
      • 2017-10-30
      • 2020-01-25
      • 2020-12-18
      • 2019-01-29
      • 2018-04-01
      • 2021-11-17
      • 2020-08-16
      相关资源
      最近更新 更多