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

错误信息

jwt signature is required

jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()

含义

令牌的第三段是空的——它要么是不受保护的 JWT(`alg: "none"`),要么是签名被截掉的已签名令牌——但你调用 `verify()` 时传入了密钥,因此签名是必需的。jsonwebtoken 会拒绝该令牌,而不是接受无人签名的声明。如果这类令牌从外部到达你的 API,可能有人在试探经典的“alg none”弱点。

原因

修复方法

  1. 1.

    保留拒绝行为和算法允许列表

    验证时使用显式的 `algorithms` 列表,只列出你的颁发者实际使用的算法。如果有未签名的令牌从外部到达,记录请求来源;不要添加接受这类令牌的代码路径。

    js
    // Always pass an explicit allow-list; "none" must never be in it.
    const claims = jwt.verify(token, publicKey, { algorithms: ["ES256"] });
  2. 2.

    用一次性密钥为测试令牌签名

    在测试初始化时生成密钥对,并用它为测试夹具签名,这样测试走的就是与生产环境相同的验证路径。

    js
    import { generateKeyPairSync } from "node:crypto";
    
    // Test setup: a throwaway key pair, real signatures, same verification path as production.
    const { privateKey, publicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" });
    const token = jwt.sign({ sub: "test-user" }, privateKey, { algorithm: "ES256", expiresIn: "5m" });

相关错误

浏览完整的签名错误库