JWT 和一次性令牌?

Inx*_*x51 4 api rest one-time-password jwt asp.net-core

我正在滚动我自己的 JWT 令牌身份验证,但是,我真的希望它是一次性令牌——所以一旦使用它,服务器就会生成一个新令牌,客户端将不得不在此期间使用该令牌下一个请求/调用。

然而,据我所知,JWT 应该是“无状态的”——但是使用一次性令牌的方法,我想我需要以某种方式存储有效的令牌,因为一旦使用令牌就会刷新。或者有什么方法可以避免在服务器上存储值,并且仍然能够创建一次性令牌?

我不想存储任何值的两个主要原因首先是可扩展性(当然,我可以在中间设置缓存服务器来存储值,但如果不需要这样做会很好),其次,根据我的理解,JWT 应该是无状态的,如果我需要在服务器上存储一个值以验证令牌,就不会是无状态的。

有任何想法吗?

小智 11

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


Con*_*enu 5

当然,解决方案是存在的。

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

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

  2. 您选择一致性(无论如何您都不允许多次使用令牌)。在这种情况下,您使用带有已使用令牌的中央数据库,并且每次需要执行操作时都会检查该数据库。可扩展性?您可以对令牌使用分片并拥有n数据库,每个数据库负责一个令牌子集。

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


Mrk*_*dig 2

并不是真的不行,如果 JWT 令牌没有过期并且签名正确,那么它就是有效的,通常人们会保留一个黑名单令牌的数据库,这些令牌通常是人们已经注销的令牌等。

我能想到的唯一明智的方法是给它们一个较短的到期时间并维护已使用的令牌列表,然后定期从数据库中删除随后到期的令牌。

实际上,有些数据库在记录上有 TTL(dynamoDBmongodb),因此您只需放入令牌并设置令牌过期时的 TTL。

2022 年更新需要明确的是,JWT 令牌不是无状态的,他们声称,只要它们由正确的私钥签名 - 就会为您提供一条有状态的数据,可以由您的 API 重新发布以反映当前状态用户。

您只需要处理消费者的令牌重新发行。