【问题标题】:Symfony 4 and LexikJWTAuthenticationBundle what is the storage of tokens?Symfony 4 和 LexikJWTAuthenticationBundle 令牌的存储是什么?
【发布时间】:2019-05-16 05:27:42
【问题描述】:

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

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

【问题讨论】:

    标签: symfony4 lexikjwtauthbundle


    【解决方案1】:

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

    这是它的工作原理:

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

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

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

    【讨论】:

    • 感谢您的回答。我还有一个问题 - 所以你的意思是这些令牌没有存储在任何地方。因此,当用户发送令牌时,它会被密钥对或其他凭据解码,是吗?这就是为什么不需要存储它们?
    • 没有钥匙的人都可以解码,如果我没记错你只是用.(点)字符分割令牌,它应该包含三个部分,你可以base64_decode每个部分并读取输出。第一部分是标题,第二部分是数据,最后是签名。使用密钥对签名进行解码,从而证明 JWT 是由应用程序创建的,但即使没有密钥也可以完成数据解码。只需将 JWT 密钥粘贴到 jwt.io 并亲自查看内容。
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2022-01-13
    • 2019-01-27
    • 1970-01-01
    • 2018-07-27
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多