使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名

Posted

技术标签:

【中文标题】使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名【英文标题】:JWT token generated using jsonwebtoken library gives invalid signature in jwt.io 【发布时间】:2019-04-10 15:40:56 【问题描述】:

简而言之:使用以下代码生成的令牌提供了正确的标头和有效负载(当我将生成的令牌粘贴到 JWT.io 中时)。

它仅在我插入密码并按下 jwt.io 中的密码编码复选框时才有效。之后我得到了有效的令牌。

但是 var token = jwt.sign(payload, privateKEY, signOptions);这一步应该和我猜的一样。

我的代码。

  var jwt = require('jsonwebtoken');
    var payload = 
       "userId" : 'YYYYYYYYYYYYYYYYYYYYYYY',
       "iat" : new Date().getTime(),
    ;
    var signOptions = 
      algorithm:  "HS512"  
    ;
    var privateKEY = 'XXXXXXXXXXXXXXXXXXXXXXXX'; 
    var token = jwt.sign(payload, privateKEY, signOptions); 
    console.log("Token :" + token);

这给了我一个无效的令牌,但是当我将该令牌粘贴到 jwt.io 中时,我得到了正确的标头和有效负载。 如果我插入我的秘密并按下复选框,我会得到正确的令牌。 我在做什么我做错了。谢谢

【问题讨论】:

【参考方案1】:

当您选中 jwt.io 上的复选框时,它会通过 base64 对您的密码进行解码。由于您没有在代码中对您的密码进行 base64 编码,因此您不应该在 jwt.io 上选中该框。两个令牌都是正确的,但用于不同的秘密。如果您想要从 jwt.io 获得的相同令牌并选中该框,您可以使用:

var decodedSecret = Buffer.from(privateKEY, 'base64');

然后使用它来签署您的令牌,而不是 privateKEY。但是,这并没有什么意义,因为您的密钥一开始就不是 base64 编码的。

【讨论】:

以上是关于使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名的主要内容,如果未能解决你的问题,请参考以下文章

使用由 jose4j 生成的令牌在 node.js 中使用 jsonwebtoken 验证 JWT 失败

Express接口案例 使用jsonwebtoken

缺少库 JWT Spring Boot Java

Node中使用token(基于第三方包jsonwebtoken)

JWT应用

JsonWebToken 遇到问题; JsonWebToken 错误:必须提供 JWT