跳到主要内容
ecdsa.com
jsonwebtoken (Node.js)JWT 库

错误信息

jwt malformed

含义

jsonwebtoken 的 jwt.verify() 连令牌都无法解析:这个字符串按点号拆分后不是恰好三段。签名根本没有被检查——你传入的字符串在结构上就不是 JWT。(如果字符串确实有三段,但头部不是 base64url 编码的 JSON,则会在下一步报出“invalid token”。)

原因

修复方法

  1. 1.

    验证前去掉方案前缀

    只取 Authorization 请求头中的令牌部分,并对请求头缺失的情况做好防护,这样失败时返回的是明确的 401,而不是“jwt malformed”。

    js
    const auth = req.headers.authorization ?? "";
    const [scheme, token] = auth.split(" ");
    if (scheme !== "Bearer" || !token) {
      return res.status(401).json({ error: "missing bearer token" });
    }
    jwt.verify(token, publicKey, { algorithms: ["ES256"] });
  2. 2.

    记录原始值并统计段数

    一行日志就能告诉你,问题出在前缀、截断还是变量用错。JWS 恰好有 3 段;JWE 有 5 段;其他情况都不是令牌。

    js
    console.log(JSON.stringify(token).slice(0, 80));
    console.log("segments:", String(token).split(".").length); // must be 3
  3. 3.

    检查令牌实际包含的内容

    把这个字符串粘贴到下方的 JWT 调试器中:它会在本地解码头部和声明,并准确指出哪一段有问题——或者告诉你这个字符串根本不是 JWT。

相关错误

浏览完整的签名错误库