Mensagem de erro
secret or public key must be provided
Também aparece como
- secretOrPrivateKey must have a value
`jwt.sign()` informa o mesmo problema como “secretOrPrivateKey must have a value” (um `Error` simples).
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify(); the sign() twin is a plain Error
O que significa
`jwt.verify()` recebeu um token assinado, mas o argumento da chave está vazio (`undefined`, `null` ou `""`). O jsonwebtoken não consegue verificar uma assinatura sem chave, então interrompe o processo antes mesmo de olhar o token. O lado da assinatura tem um erro gêmeo, `secretOrPrivateKey must have a value`, lançado por `jwt.sign()` pelo mesmo motivo.
Por que acontece
A variável de ambiente não está definida aqui
comum`process.env.JWT_SECRET` ou `JWT_PUBLIC_KEY` existe na máquina de um desenvolvedor, mas não no contêiner, no job de CI ou na função serverless. Os painéis das plataformas costumam limitar as variáveis por ambiente (preview e produção).
O .env é carregado depois que o valor foi lido
comumUm módulo que lê `process.env.JWT_SECRET` no momento da importação captura `undefined` quando o `dotenv` é configurado mais adiante no arquivo de entrada. Com módulos ES, as importações são avaliadas antes que o código do arquivo que importa seja executado.
Um callback de chave não retornou nada
ocasionalCom uma função `getKey(header, callback)` (por exemplo, baseada no jwks-rsa), chamar `callback(null, undefined)` — porque uma busca não retornou nenhuma chave — produz este erro em vez de um erro de chave não encontrada.
Como corrigir
- 1.
Validar a configuração na inicialização
Leia as chaves obrigatórias uma vez, quando o processo inicia, e encerre com uma mensagem clara se alguma estiver faltando. Assim, uma instância mal configurada nunca começa a atender requisições.
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.
Carregar os arquivos de ambiente antes de tudo
Importe `dotenv/config` como a primeira de todas as importações, ou use a flag nativa `--env-file` do Node, para que todos os módulos vejam os 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