Java jwt令牌实际上是如何创建的?

Java jwt令牌实际上是如何创建的?,java,spring,spring-boot,spring-security,jwt,Java,Spring,Spring Boot,Spring Security,Jwt,我有一个应用程序正在使用基于JWT令牌的授权。所以我在玩它。我会告诉你我所遵循的步骤 通过使用postman的API调用为用户获取JWT令牌 复制了JWT令牌并将其粘贴到JWT.io网站上 我得到了一些有效载荷值和标题 尝试使用我从第3步获得的确切标头和有效负载从网站创建一个新的JWT令牌 使用了我的服务器用来散列JWT令牌的相同密钥 最后,我在新创建的JWT令牌中得到了一个不同的签名 那么原因是什么呢?我使用了相同的有效载荷、相同的头和相同的密钥,但仍然得到了不同的签名为什么?请帮助我。JWT

我有一个应用程序正在使用基于JWT令牌的授权。所以我在玩它。我会告诉你我所遵循的步骤

  • 通过使用postman的API调用为用户获取JWT令牌
  • 复制了JWT令牌并将其粘贴到JWT.io网站上
  • 我得到了一些有效载荷值和标题
  • 尝试使用我从第3步获得的确切标头和有效负载从网站创建一个新的JWT令牌
  • 使用了我的服务器用来散列JWT令牌的相同密钥
  • 最后,我在新创建的JWT令牌中得到了一个不同的签名

  • 那么原因是什么呢?我使用了相同的有效载荷、相同的头和相同的密钥,但仍然得到了不同的签名为什么?请帮助我。

    JWT的签名是散列函数的输出。此函数的输出可能取决于您提到的字段以外的字段。例如,您的JWT可能有一个发出时间(
    iat
    )字段,这对于您正在检查的两个令牌来说是不同的。如果是这样,那么两个令牌的校验和也将不相同


    我的一般建议是验证JWT中的所有字段是否都是相同的。

    是的,我知道。当我的服务器创建令牌时,我将在每个API调用中为同一用户获得不同的令牌。因为我正在设置令牌的过期时间。到期时间与当前时间+2天类似。但事实并非如此。我正在获取令牌,并将其粘贴到jwt.io网站上,抓取头和负载,并尝试创建一个新的jwt令牌,其值与服务器使用的密钥完全相同。这一次令牌不是由我的服务器生成的。@jithinMV您确定
    jwt.io
    站点和您的代码使用相同的算法生成签名吗?是的,它们都使用HS512。当您用程序验证签名时,签名是不同的还是无效的?对于相同的输入(相同的报头、有效负载、密钥),您可以获得相同的输出(签名)。相同表示相同的字符串。如果只有一点不同,签名将完全不同。空格不算数,因为它在base64转换之前被剥离。查看生成令牌和两个不同令牌的代码可能会有所帮助。