エラーメッセージ
secret or public key must be provided
別の表記
- secretOrPrivateKey must have a value
`jwt.sign()` は同じ問題を「secretOrPrivateKey must have a value」(通常の `Error`)として報告します。
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify(); the sign() twin is a plain Error
このエラーの意味
`jwt.verify()` は署名付きトークンを受け取りましたが、鍵の引数が空です(`undefined`、`null`、または `""`)。jsonwebtoken は鍵がなければ署名を検証できないため、トークンを調べる前に処理を中断します。署名側にも対になるエラー `secretOrPrivateKey must have a value` があり、同じ理由で `jwt.sign()` がスローします。
発生する理由
この環境では環境変数が設定されていない
よくある`process.env.JWT_SECRET` や `JWT_PUBLIC_KEY` が、開発者のマシンにはあるものの、コンテナー、CI ジョブ、サーバーレス関数にはありません。プラットフォームのダッシュボードでは、変数のスコープが環境ごと(プレビューと本番)に分かれていることがよくあります。
値を読み取った後で .env が読み込まれている
よくあるインポート時に `process.env.JWT_SECRET` を読み取るモジュールは、エントリファイルでそのインポートより後に `dotenv` が設定されていると、`undefined` を取得してしまいます。ES モジュールでは、インポートは、インポートする側のファイルのコードが実行される前に評価されます。
鍵のコールバックが何も返さなかった
ときどき`getKey(header, callback)` 関数(たとえば jwks-rsa を利用するもの)で、検索で鍵が見つからなかったために `callback(null, undefined)` を呼び出すと、鍵が見つからないことを示すエラーではなく、このエラーが発生します。
修正方法
- 1.
起動時に設定を検証する
必要な鍵はプロセスの起動時に一度だけ読み込み、欠けているものがあれば明確なメッセージを出して終了してください。そうすれば、設定を誤ったインスタンスがリクエストの処理を始めることはありません。
js function requireEnv(name) { const value = process.env[name]; if (!value) throw new Error(name + " is not set"); return value; } const JWT_PUBLIC_KEY = requireEnv("JWT_PUBLIC_KEY"); // evaluated once at startup - 2.
ほかの何よりも先に環境ファイルを読み込む
`dotenv/config` を最初のインポートにするか、Node に組み込まれた `--env-file` フラグを使い、すべてのモジュールから値が見えるようにしてください。
js // Load .env before any module that reads process.env at import time. import "dotenv/config"; import { app } from "./app.js"; // Node 20.6+: no package needed // node --env-file=.env server.js