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

错误信息

jwt must be provided

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

含义

`jwt.verify()` 根本没有收到令牌:第一个参数是 `undefined`、`null` 或空字符串。jsonwebtoken 在解析之前就做了这项检查,所以此时密钥和令牌格式都还无关紧要。问题出在上游——从请求中提取令牌的代码什么也没找到。

原因

修复方法

  1. 1.

    防御性地提取令牌,并返回 401

    在调用 `verify` 之前检查令牌是否缺失,缺失时返回带 `WWW-Authenticate: Bearer` 头的 401。这样客户端看到的是“未经身份验证”,而不是未捕获错误导致的 500。

    js
    function bearerToken(req) {
      const [scheme, token] = (req.headers.authorization ?? "").split(" ");
      return scheme?.toLowerCase() === "bearer" && token ? token : null;
    }
    
    app.use((req, res, next) => {
      const token = bearerToken(req);
      if (!token) return res.status(401).set("WWW-Authenticate", "Bearer").end();
      try {
        req.user = jwt.verify(token, publicKey, { algorithms: ["ES256"] });
        next();
      } catch {
        res.status(401).set("WWW-Authenticate", 'Bearer error="invalid_token"').end();
      }
    });
  2. 2.

    让客户端附上令牌

    在浏览器的网络面板中确认请求携带了 `Authorization: Bearer …`(或该 cookie)。如果在浏览器中能看到这个请求头,服务器上却没有,说明中间的代理把它去掉了。

    js
    // Browser / Node 18+ fetch: the token must be attached explicitly.
    await fetch("https://api.example.com/orders", {
      headers: { Authorization: "Bearer " + accessToken },
    });
    
    // Cookies cross origins only with credentials and SameSite=None; Secure.
    await fetch("https://api.example.com/orders", { credentials: "include" });

相关错误

浏览完整的签名错误库