symfony4 - Symfony 4 和 LexikJWTAuthenticationBundle 令牌的存储是什么?
问题描述
我正在使用带有 LexikJWTAuthenticationBundle 的 Symfony 4。我的应用程序运行良好,但我想知道 用户令牌的存储位置在哪里。确保它们没有存储在数据库中。
现在我可以使用TokenStorageInterface
并调用$tokenStorage->getToken()->getUser()
通过令牌获取登录用户(令牌在标头中发送)。这里有人可以向我解释它是如何工作的吗?
解决方案
JWT 令牌不存储在任何地方,它们是自包含的。令牌包含它需要的所有信息,例如用户 ID(或用户名或您配置的任何内容)并由您的密钥签名,因此您的应用程序知道它是由应用程序还是其他人创建的。
下面是它的工作原理:
- 您通过捆绑包创建一个令牌,默认情况下它包含令牌类型、令牌到期日期、您的角色和您的用户标识符(id、用户名、电子邮件、任何配置),它还由公钥/私钥对或其他任何内容签名你配置了
- 您的客户端使用 JWT 令牌发送请求
- 捆绑包检查令牌是否由应用程序签名以及是否未过期(以及您是否没有将令牌标记为无效)
- 捆绑包通知 Symfony 安全系统,令牌将您认证为存储在用户标识符中的用户
这就是简化的流程,这就是创建 JWT 令牌的原因——您不需要将它们存储在任何地方,它们包含所有信息并且不能被篡改。
存储 JWT 令牌的唯一原因是,如果您想在它们过期之前使其失效,那么您需要存储令牌并检查它是否已失效;如果是,您可以使用捆绑包中提供的事件将其标记为无效。
推荐阅读
- javascript - 如何创建带参数的点函数?
- java - java中类的内存分配
- c# - 在 C# 中调用 ShellWindows FindWindowSW 方法
- python - 更改使用 urllib.request.urlretrieve() 下载的本地存储的 .html 文件的编码
- ruby-on-rails - Rails:在循环中渲染部分会导致未定义的变量
- registry - 一种在 Installscript 中检查机器上是否存在注册表的方法
- haskell - Haskell 从函数打印硬编码值
- sql-server - 一个 CASE 执行的多个 ACTIONS
- java - 如何根据 FirstName 和 LastName 生成唯一 ID?
- java - Java NIO 关于多线程的问题