为啥 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 会抛出“无效签名”错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 FileOutputStream 会抛出 FileNotFoundException?
为啥“prepareCall”会抛出 NumberFormatException?