【问题标题】:Json Web Token verify() return jwt malformedJson Web Token verify() 返回 jwt 格式错误
【发布时间】:2019-01-21 18:12:39
【问题描述】:
const jwt = require("jsonwebtoken");
const SECRET = "superSuperSecret";

module.exports = function(req, res, next) {
    const token = req.body.token || req.query.token || req.headers[ "x-access-token" ];
    if (token) {
        return jwt.verify(token, SECRET, function(err, decoded) {
            if (err) {
                return res.json({
                    success: false,
                    message: "Failed to authenticate token.",
                });
            }
            req.user = decoded;
            return next();
        });
    }
    return res.unauthorized();
};

我正在使用 Postman 来测试我的 API。我使用x-access-token 键和值superSuperSecret 设置标题。我收到错误{"name":"JsonWebTokenError","message":"jwt malformed","level":"error"}。我正在使用这个https://github.com/FortechRomania/express-mongo-example-project/blob/master/src/middlewares/validateToken.js

【问题讨论】:

  • 你在控制台之后得到的token的值是多少?
  • @SookieSingh superSuperSecret
  • 另外我认为带有回调的 jwt.verfy 是异步函数

标签: node.js express jwt postman


【解决方案1】:

您不能将任何值作为令牌传递。您需要jwt.sign() 来创建令牌。查看JWT 的文档了解更多信息。

还有,

对于请求标头名称,只需使用Authorization 而不是x-access-token。将 Bearer 放在 Token 之前。

Authorization: Bearer TOKEN_STRING

JWT 的每一部分都是一个 base64url 编码的值。你可以得到你的令牌:

var token = req.headers.authorization.split(' ')[1];

【讨论】:

  • 什么是 TOKEN_STRING?
  • 你能在这里看看我的问题吗:stackoverflow.com/questions/65277469/…
  • @TM TOKEN_STRING 是您登录系统后从服务器获取的JWT(JSON Web Token)。对于每个请求,您从客户端发送到服务器(仅适用于受保护的路由),您必须在 Authorization 标头中附加令牌,以便服务器知道该请求是经过身份验证的请求。
【解决方案2】:

据我所知,您发送的不是实际的 JWT 令牌,而是秘密。一个有效的 JWT 令牌由一个由点分隔的三部分字符串组成,如下所示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36Pok6yJV_adQ

https://jwt.io/

正如您在上述网站上看到的,“superSuperSecret”不是有效的 JWT 令牌。

【讨论】:

  • 那有什么解决办法。我的代码也在生成相同的令牌。我有这个代码:let payLoad = { subject: user._id }; let token = jwt.sign(payLoad, 'secretKey'); res.status(200).send({ token, userData, user });
【解决方案3】:

注意:

JWT 将返回 jwt malformed 如果 Token 为 null/Invalid-Signature 被传递给 jwt.verifty 函数

让令牌 = null;
让有效载荷 = jwt.verify(token, 'secretKey'); // 错误:jwt 格式错误

【讨论】:

【解决方案4】:

来自客户端的令牌可以作为 null 或空白字符串传递,然后会生成此错误。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
【解决方案5】:

令牌由点分隔的 3 部分组成。下面有一段来自 jsonwebtoken 的代码

var parts = jwtString.split('.');

if (parts.length !== 3){
  return done(new JsonWebTokenError('jwt malformed'));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2021-07-27
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多