为啥 jsonwebtoken 会抛出“无效签名”错误?

Posted

技术标签:

【中文标题】为啥 jsonwebtoken 会抛出“无效签名”错误?【英文标题】:Why is jsonwebtoken throwing an "invalid signature" error?为什么 jsonwebtoken 会抛出“无效签名”错误? 【发布时间】:2019-12-07 00:06:24 【问题描述】:

我正在使用 jsonwebtoken 包 (https://github.com/auth0/node-jsonwebtoken) 来处理我的项目中的 JWT。无论我尝试什么,它都会给我这个错误:name: 'JsonWebTokenError', message: 'invalid signature'

这是我签署 JWT 的地方:

const addBearerToken = (myUser, cb) => 
  jwt.sign(user: myUser, userId: myUser.id, 'helloworld', (err, token) => 
    if (err) return (err, null)
    userRepo.update(myUser._id, authToken: token, (err, myUser) => 
      if (err) 
        return cb(err, null)
       else 
        return cb(null, token)
      
    )
  )

这是我尝试验证的地方:

const checkForJWT = (req, res, next) => 
  let bearerHeader = req.header('Authorization').split(' ')
  let token = bearerHeader[1]
  console.log(token + '  ||  token')
  jwt.verify(token, 'helloworld', (err, decoded) => 
    if (err) 
      console.log(err)
      return (err, null) // this is where the error is thrown
     else 
    ...
    
  )

我使用“helloworld”代替我的密钥。我怀疑问题出在密钥上,但就像我说的那样,我不确定导致此错误的幕后情况。

如果我使用 jwt.decode(token, 'helloworld') 我会得到所有正确的信息。但是当我使用 jwt.verify() 时出现错误。

非常感谢任何帮助。如果您需要我的代码中的更多信息,请告诉我。

【问题讨论】:

好吧,您正在将整个用户记录添加到令牌(够糟糕),并且该记录甚至包含您之前存储到数据库中的令牌(更糟)。我建议只添加一些必要的声明,例如用户 ID 和令牌的到期时间。您可以在jwt.io 上检查您的令牌 好的,我去看看 jwt.io。我忘了添加 jwt.decode() 工作得很好,但 jwt.verify() 没有,这对我来说似乎很奇怪。 我刚刚使用了jwt.io,它验证了签名。我还更改了上面的令牌以删除用户信息。 是的,你是对的;我误认为它正在被验证。我稍后会发布新代码和令牌。我在删除所有用户信息时遇到问题,我不想在 SO 上提供这些信息。顺便说一句,感谢您的帮助。 不客气。请。从不发布真实数据,这里只测试数据。您可以将您的帖子标记为“需要主持人干预”并解释问题。我认为他们可以提供帮助。 【参考方案1】:

我也遇到了同样的问题,我通过toString方法转换token解决了。

await jwt.verify(token.split(" ")[1].toString(),'secret');

【讨论】:

【参考方案2】:

尝试使用 base64 文本作为键。我也遇到了这个问题,但是使用 base64 密钥解决了我的问题。

【讨论】:

您可以详细解释如何精确地利用 base64 来解决 OP 的问题/问题。我是审稿人。 *** 请求审查,因为您是新贡献者。您的回答表示赞赏和帮助。此评论旨在帮助您将一个好的答案变成一个优秀的答案。 jwt.verify 将密钥或公钥作为第二个参数来验证签名。密钥应采用 base64 格式(以 == 结尾)。这解决了我的无效签名问题 如果你已经完全解决了你的 OP 的问题/问题,那么你应该为它写一个答案,然后接受你的答案,这样浏览的人(可能是几年后)可以很容易地看到问题的答案无需通读所有 cmets。 a) 既不清楚您真正遇到了什么问题,也不清楚 base64 编码如何解决它,我怀疑它会对 OP 有所帮助。 b) base64 编码的字符串可以有 0、1 或 2 个填充字符 (=)。一个常见的误解是 base64 字符串总是以 == 结尾

以上是关于为啥 jsonwebtoken 会抛出“无效签名”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有时会抛出 FileNotFoundException

为啥 FileOutputStream 会抛出 FileNotFoundException?

为啥“prepareCall”会抛出 NumberFormatException?

为啥 BluetoothSetLocalServiceInfo 会抛出错误 1314?

为啥geoip会抛出异常?

为啥这个 OdbcConnection 会抛出 System.InvalidOperationException?