如何在数据库中正确存储 JWT 刷新令牌?

Sco*_*rnz 5 authentication flask jwt

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

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

我主要在概念上遵循了本指南。这种重复登录并获取刷新令牌正常吗?我不知道如何手动查找和删除同一浏览器中使用的较旧(但仍然有效)的令牌。

Mic*_*ski 3

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

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

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