我正在使用后端和基于JWT的身份验证中使用Go
的Web应用程序。当用户登录时,我向他们发送访问 token (具有较短的到期时间)和刷新 token (具有较长的到期时间)。这两个 token 都包含username
作为其有效负载。它们是用不同的 secret 创建的。我的问题是关于注销。当用户发送注销请求时,我想使其刷新 token 无效,以便注销后需要他们再次登录。为了解决问题,我将刷新 token 存储在数据库的黑名单表中。我的问题是,在将刷新 token 存储在数据库中之前,是否需要对它进行哈希处理。谢谢。
最佳答案
JWT的标准声明(RFC 7519 §4.1.7)之一是"jti"
,它是 token 的唯一标识符。如果在刷新 token 中包含唯一标识符,则足以将"jti"
和"exp"
(到期)声明存储在数据库中。 (我默认使用 ("github.com/satori/go.uuid").NewV4
生成"jti"
作为随机UUID,并且在内部由"crypto/rand"
随机数生成器提供支持。)
现在,如果提供了刷新 token ,则可以进行常规检查以确保其正确签名和未过期,然后在数据库中查找"jti"
。如果它不在黑名单中,那么它很适合重用。您只需要在数据库中保留"exp"
即可知道何时安全清除记录。由于"jti"
只是一个随机标识符,因此您无法从"jti"
返回任何可识别的信息,因此无需特别对其进行哈希处理或加密。
如果您没有"jti"
并且无法添加一个,则我可能会对该 token 进行哈希处理,或者只是保留声明的副本。部分原因是出于空间原因,部分原因是您不想存储实际上是有效凭证的内容。保留足够的信息,以便您可以唯一地标识 token ;可能"sub"
和"exp"
时间在一起是足够的信息(如果发给同一主题的两个 token 在同一秒到期,则无法区分)。
关于database - 我是否需要对存储在数据库中的刷新 token 进行哈希处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60918317/