本文へスキップ
ecdsa.com
jsonwebtoken (Node.js)JWT ライブラリ

エラーメッセージ

jwt must be provided

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

このエラーの意味

`jwt.verify()` にトークンがまったく渡されていません。第 1 引数が `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" });

関連するエラー

署名エラーデータベースをすべて見る