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/。
当然,解决方案是存在的。
与任何分布式系统(您提到可扩展性)一样,您必须在可用性和一致性之间进行选择。
您选择可用性。在这种情况下,您可以维护一个已使用令牌的列表,您可以在所有端点之间以最终一致的方式复制这些令牌。例如,当使用令牌时,相应端点将该令牌发送到后台中的其他端点。但是,存在一个(短)时间范围,另一个端点可以再次使用该令牌,直到更新该端点。
您选择一致性(无论如何您都不允许多次使用令牌)。在这种情况下,您使用带有已使用令牌的中央数据库,并且每次需要执行操作时都会检查该数据库。可扩展性?您可以对令牌使用分片并拥有n数据库,每个数据库负责一个令牌子集。
这取决于您的业务,哪种解决方案最适合。
| 归档时间: |
|
| 查看次数: |
17037 次 |
| 最近记录: |