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

エラーメッセージ

jwt malformed

このエラーの意味

jsonwebtoken の jwt.verify() は、トークンを解析することすらできませんでした。文字列をドットで区切っても、ちょうど 3 つのセグメントになりません。署名の検証は行われていません。渡した文字列は、構造上 JWT ではありません。(セグメントが 3 つあっても、ヘッダーが base64url の JSON ではない文字列は、1 段階後に「invalid token」で失敗します。)

発生する理由

修正方法

  1. 1.

    検証の前にスキームのプレフィックスを取り除く

    Authorization ヘッダーからトークン部分だけを取り出し、ヘッダーがない場合にも備えてください。そうすれば、「jwt malformed」ではなく明確な 401 で失敗させることができます。

    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.

    生の値をログに出力してセグメントを数える

    ログを 1 行出力するだけで、原因がプレフィックスなのか、切り詰めなのか、誤った変数なのかがわかります。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 ではないことを正確に示します。

関連するエラー

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