我正在开发一个Go在后端和基于 JWT 的身份验证中使用的 Web 应用程序。当用户登录时,我会向他们发送过期时间较短的访问令牌和过期时间较长的刷新令牌。这两个令牌都包含username在它们的有效负载中。它们是用不同的秘密创建的。我的问题是关于注销。当用户发送注销请求时,我想使其刷新令牌无效,以便他们需要在注销后再次登录。对于解决方案,我将把刷新令牌存储在我数据库的黑名单表中。我的问题是我是否需要在将刷新令牌存储到数据库之前对其进行哈希处理。谢谢。
1 回答
慕容3067478
TA贡献1773条经验 获得超3个赞
标准 JWT 声明(RFC 7519 §4.1.7)之一是"jti"
,它是令牌的唯一标识符。如果您在刷新令牌中包含唯一标识符,那么将"jti"
and "exp"
(expiration) 声明存储在数据库中就足够了。(我默认使用("github.com/satori/go.uuid").NewV4
生成"jti"
随机 UUID,这在内部由"crypto/rand"
随机数生成器支持。)
现在,如果您收到一个刷新令牌,您可以进行常规检查以确保它已正确签名且未过期,然后"jti"
在数据库中查找。如果它不在黑名单上,那么它可以重复使用。您只需要保存"exp"
在数据库中即可知道何时可以安全地清除记录。由于"jti"
只是一个随机标识符,因此您无法从 中获取"jti"
任何可识别信息,因此没有特别需要对其进行散列或加密。
如果您没有"jti"
并且无法添加一个,我可能会散列令牌或只保留声明的副本。部分原因是出于空间原因,部分原因是您不想存储实际上是有效凭证的东西。保留足够的信息,以便您可以唯一地识别令牌;可能 the"sub"
和"exp"
time 一起是足够的信息(如果发行给同一主题的两个令牌在同一秒到期是无法区分的)。
- 1 回答
- 0 关注
- 126 浏览
添加回答
举报
0/150
提交
取消