【问题标题】: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 上提供这些信息。顺便说一句,感谢您的帮助。
  • 不客气。请。从不发布真实数据,这里只测试数据。您可以将您的帖子标记为“需要主持人干预”并解释问题。我认为他们可以提供帮助。

标签: node.js jwt express-jwt


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

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