Symfony 4 和 LexikJWTAuthenticationBundle 令牌的存储是什么?

Symfony 4 and LexikJWTAuthenticationBundle what is the storage of tokens?

我正在使用带有 LexikJWTAuthenticationBundle 的 Symfony 4。我的应用程序运行良好,但我想知道 用户的令牌 存储在哪里。可以肯定的是,它们没有存储在数据库中。

现在我可以使用 TokenStorageInterface 并调用 $tokenStorage->getToken()->getUser() 通过令牌获取登录用户(令牌在 headers 中发送)。有没有人可以向我解释它是如何工作的?

JWT 令牌没有存储在任何地方,它们是 self-contained。令牌包含它需要的所有信息,例如用户 ID(或用户名或您配置的任何内容)并由您的密钥签名,因此您的应用程序知道它是由应用程序还是其他人创建的。

工作原理如下:

  1. 您通过捆绑包创建一个令牌,默认情况下它包含令牌类型、令牌到期日期、您的角色和您的用户标识符(id、用户名、电子邮件,无论配置如何),它还由 public/private 密钥对或您配置的任何内容
  2. 您的客户端发送带有 JWT 令牌的请求
  3. 捆绑包会检查令牌是否由应用签名,是否未过期(以及您是否未将令牌标记为无效)
  4. 捆绑包通知 Symfony 安全系统令牌将您验证为存储在用户标识符中的用户

这就是简化的流程,这就是创建 JWT 令牌的原因 - 您不需要将它们存储在任何地方,它们包含所有信息并且不能被篡改。

你存储 JWT 令牌的唯一原因是如果你想在它们过期之前使它们失效,那么你需要存储令牌并检查它是否已失效;如果是,您可以使用捆绑包中提供的事件将其标记为无效。