JWT和一次令牌



我正在滚动自己的jwt token auth的过程令牌和客户端将必须在下一个请求/呼叫期间使用该令牌。

但是,我已经了解了JWT应该是"无状态"的 - 但是,随着一次令牌的接近,我想我需要以某种方式存储有效的令牌,因为该令牌将刷新一次它使用了。还是有任何方法可以避免在服务器上存储一个值,并且仍然可以创建一次令牌?

为什么我不想存储任何值的两个主要原因是首先是所有可扩展性(当然,我可以在介于两个之间存储该值,但是如果不需要的话,这是很好的(,其次,JWT应该从我的理解中无状态,如果我需要在服务器上存储一个值以验证令牌。

有什么想法?

使用用户当前密码的哈希签名JWT令牌,这样,在成功更改密码之前,所有的令牌都会在下次成功更改之前无效。我从这里得到这个想法https://www.jbspeakr.cc/howto-single-use-jwt/。

解决方案当然存在。

与任何分布式系统(您提到的可伸缩性(一样,您必须在可用性和一致性之间进行选择。

  1. 您选择可用性。在这种情况下,您可以维护已经使用的代币的列表,这些令牌在所有端点之间最终以一致的方式复制。例如,当使用令牌时,相应的端点将令牌发送到背景中的其他端点。但是,有一个(很短的(时间范围,当该令牌可以第二次由另一个端点使用直到更新该端点为止。

  2. 您选择一致性(您不允许多次使用令牌(。在这种情况下,您使用具有已使用令牌的中央数据库,并且每次需要执行操作时检查该数据库。可伸缩性?您可以在令牌上使用碎片并具有n数据库,每个数据库负责令牌子集。

这取决于您的业务最适合哪种解决方案。

并非真的没有,如果jwt代币未过期并且签名正确,则有效等。

我能想到的唯一明智的方法是给他们短暂的到期时间并保持已经使用的令牌列表,然后您会定期删除随后从DB到期的列表。

实际上有一些DB在记录上具有TTL(DynamoDB,MongoDB(,因此您只需将令牌放入并设置一个TTL时,以使令牌过期。

更新2022只是要明确地说,JWT令牌并非无状态,他们声称,只要由正确的私钥签名 - 给您一个可以由API重新发行的状态数据以反映用户的当前状态。

您只需要在消费者上处理令牌。

就像其他人提到的一样,这取决于您的业务案例。密码重置链接可以如https://www.jbspeakr.cc/howto-single-use-jwt/所述。

如果您有一次性&单作者方案,您可能希望在此处使用任何先前使用和未使用的令牌,您可以存储一个nonce并在每个新的令牌请求上以及使用时更新它。

最新更新