Mensaje de error
secret or public key must be provided
También se muestra como
- secretOrPrivateKey must have a value
`jwt.sign()` informa del mismo problema como «secretOrPrivateKey must have a value» (un `Error` simple).
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify(); the sign() twin is a plain Error
Qué significa
`jwt.verify()` recibió un token firmado, pero el argumento de la clave está vacío (`undefined`, `null` o `""`). jsonwebtoken no puede comprobar una firma sin clave, así que se detiene antes de mirar el token. En el lado de la firma hay un error gemelo, `secretOrPrivateKey must have a value`, que lanza `jwt.sign()` por el mismo motivo.
Por qué ocurre
La variable de entorno no está definida aquí
frecuente`process.env.JWT_SECRET` o `JWT_PUBLIC_KEY` existe en la máquina de un desarrollador, pero no en el contenedor, en el trabajo de CI ni en la función sin servidor. Los paneles de las plataformas suelen limitar las variables a cada entorno (vista previa frente a producción).
.env se carga después de leer el valor
frecuenteUn módulo que lee `process.env.JWT_SECRET` en el momento de importarse captura `undefined` cuando `dotenv` se configura más adelante en el archivo de entrada. Con los módulos ES, las importaciones se evalúan antes de que se ejecute el código del archivo que importa.
La devolución de llamada de la clave no entregó ninguna clave
ocasionalCon una función `getKey(header, callback)` (por ejemplo, respaldada por jwks-rsa), llamar a `callback(null, undefined)` —porque una búsqueda no devolvió ninguna clave— produce este error en lugar de un error de clave no encontrada.
Cómo solucionarlo
- 1.
Validar la configuración al arrancar
Lee las claves necesarias una sola vez al iniciar el proceso y termina con un mensaje claro si falta alguna. Así, una instancia mal configurada nunca empieza a atender solicitudes.
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.
Cargar los archivos de entorno antes que nada
Importa `dotenv/config` como la primera de todas las importaciones, o usa la opción integrada `--env-file` de Node, para que todos los módulos vean los valores.
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