【问题标题】:Invalidate JWT Token in NodeJS在 NodeJS 中使 JWT 令牌无效
【发布时间】:2015-05-19 04:48:43
【问题描述】:

我关注tutorial 使用 JWT 令牌。令牌有效期设置为只有 5 分钟,但如果我想在使用 1 分钟后使令牌失效怎么办?我希望能够对/api/logout 进行 API 调用,这应该会删除我的令牌。

我正在使用 Express 和 Node。

从我可以收集的信息来看,我的选择似乎是拥有一个存储令牌的令牌数据库。当我想使我的令牌过期时,我会从数据库中过期/删除令牌。

我还看到人们随便说从物理硬盘空间“移除”令牌,但我不知道令牌物理存储在哪里以便我移除它。

【问题讨论】:

标签: node.js express token jwt


【解决方案1】:

1) 只需从客户端移除令牌

2) 创建令牌黑名单

3) 只需缩短令牌到期时间并经常轮换它们

请查看 Invalidating JSON Web Tokens Invalidating JSON Web Tokens

【讨论】:

    【解决方案2】:

    JWT 令牌身份验证的一般好处是令牌可以包含您通常保留在会话存储中的所有会话信息。这可以节省大量资源,尤其是在请求到响应的时间,因为您不必查找每个请求的会话数据 - 客户端会为您提供所有这些。

    但是,代价是无法在您选择的时间撤销 JWT 令牌,因为您忘记了状态

    在数据库中某处保留无效令牌列表的明显解决方案消除了上述好处,因为您必须再次针对每个请求查询数据库。

    更好的选择是发行短期 JWT 令牌,即令牌仅在一分钟内有效。对于 Web 应用程序,普通用户可能在一分钟内执行多个请求(用户在您的应用程序中导航)。您可以给每个用户一个 JWT 令牌,该令牌将持续一分钟,当令牌过期的请求到达时,您只需向他们发出一个新令牌。

    更新:在出示过期令牌后颁发新的访问令牌是一个非常糟糕的主意 - 您应该将过期令牌视为无效,就好像它是伪造的一样。更好的方法是让客户端提供一个refresh token,这将证明用户的身份,然后才发布新的访问令牌。请注意,验证刷新令牌必须是有状态的操作,即。您必须在数据库中的某个位置拥有每个用户的所有有效刷新令牌的列表,因为如果刷新令牌被泄露,用户必须有办法使该令牌失效。

    【讨论】:

    • 从实现的角度来看,您会将新令牌附加到响应标头吗?
    • 是的,这是有道理的。客户端应该知道访问令牌可能会随着任何请求而改变,并且应该始终使用最后一个接收到的令牌。
    • 这似乎是在无法控制的无状态和每次都访问数据库之间的一个很好的折衷方案。我仍然对在 JWT 中存储可变数据持怀疑态度,即使不得不等待 60 秒进行更改也是非常糟糕的用户体验。
    • 在数据库中存储一个刷新令牌与为每个用户在数据库中存储一个会话相比有什么区别吗?
    • @CloudWave 是的。正确完成后,您只需在访问令牌过期后查询数据库以获取刷新令牌。使用存储在数据库中的会话 ID/令牌,您很快就会发现您需要在每个请求上查询数据库以获取会话 ID。
    猜你喜欢
    • 2020-11-22
    • 2021-04-13
    • 2021-09-25
    • 2019-03-19
    • 2016-12-23
    • 2016-09-22
    • 2016-12-03
    • 2019-01-12
    相关资源
    最近更新 更多