Сообщение об ошибке
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 или бессерверной функции. В панелях управления платформ переменные часто задаются отдельно для каждого окружения (preview и production).
.env загружается уже после того, как значение прочитано
частоМодуль, который читает `process.env.JWT_SECRET` в момент импорта, получает `undefined`, если `dotenv` настраивается дальше во входном файле. В 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