Json Web Token verify() 返回 jwt 格式错误

Posted

技术标签:

【中文标题】Json Web Token verify() 返回 jwt 格式错误【英文标题】:Json Web Token verify() return jwt malformed 【发布时间】: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 是异步函数 【参考方案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? 你能在这里看看我的问题吗:***.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 格式错误

【讨论】:

我遇到了同样的问题,我需要你的帮助。 看看这是我的代码:let payLoad = subject: user._id ; let token = jwt.sign(payLoad, 'secretKey'); @Tanzeel 你能分享你的代码(中间件)吗,我想看看,以便帮助? 是的,当然。这是:github.com/tmtanzeel/socialcoderapinodejs/blob/main/routes/… 这里我打开了一个问题:***.com/questions/65277469/…【参考方案4】:

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于Json Web Token verify() 返回 jwt 格式错误的主要内容,如果未能解决你的问题,请参考以下文章

verify_authenticity_token 尚未定义

rails skip_before_filter :verify_authenticity_token 不工作

华为支付购买Token的verify接口报错wrong application

为啥 openssl_verify() 无法验证我的 JWT 令牌签名?

iframe 导致 Can't Verify CSRF Token Authenticity n Rails

JSON Web Token