Mensagem de erro
invalid signature
O que significa
O token foi analisado sem problemas e a estrutura dele é válida, mas a verificação criptográfica falhou: a assinatura sobre cabeçalho.payload não confere com a chave que você forneceu. Ou a chave não é a que assinou o token, ou os bytes assinados mudaram depois da assinatura.
Por que acontece
Verificação com a chave errada
comumDe longe o caso mais frequente: o ambiente tem uma chave diferente da que o emissor usou — uma chave pública desatualizada depois de uma rotação, uma chave de homologação usada com tokens de produção, ou uma divergência de kid no JWKS quando o verificador fixa uma chave enquanto o emissor assina com outra.
Uma implementação própria de assinatura assinou os bytes errados
ocasionalCódigo que monta tokens à mão precisa assinar com SHA-256 os bytes ASCII de base64url(header).base64url(payload) e gerar o r‖s bruto de 64 bytes que a RFC 7518 exige para ES256. Assinar o próprio JSON, segmentos em base64 padrão ou um digest SHA-384 com um cabeçalho ES256 produz uma assinatura bem formada que nunca passa na verificação. (Uma assinatura codificada em DER é rejeitada antes da verificação, com “"ES256" signatures must be "64" bytes”, e um PEM corrompido por uma variável de ambiente nem chega a ser aceito como chave: ele falha com “secretOrPublicKey must be an asymmetric key when using ES256”.)
O token foi modificado depois de assinado
ocasionalUm proxy, um logger ou um cliente reserializou o JSON do payload ou alterou caracteres nele. Até um único caractere alterado no cabeçalho ou no payload invalida a assinatura — esse é justamente o propósito de assinar. (Um padding Base64 acrescentado a um segmento falha uma etapa antes, com “invalid token”; um token truncado falha com “jwt malformed” ou com um erro de comprimento da assinatura.)
Como corrigir
- 1.
Calcular a impressão digital da chave nos dois lados
Calcule o hash da chave pública que o verificador realmente carregou e compare-o com o da chave do emissor. Impressões digitais diferentes indicam uma chave desatualizada ou errada — de longe a causa mais frequente — e encerram a busca em um só passo.
js import { createHash, createPublicKey } from "node:crypto"; // Run on the verifier, and on the issuer with its signing key: the outputs must match. const spki = createPublicKey(process.env.JWT_PUBLIC_KEY).export({ type: "spki", format: "der" }); console.log(createHash("sha256").update(spki).digest("hex")); - 2.
Conferir se o kid do token corresponde à chave de verificação
Decodifique o cabeçalho sem verificar e compare o kid dele com o da chave que você tem. Se o emissor publica um JWKS, localize a chave pelo kid em vez de fixar uma no código.
js const { header } = jwt.decode(token, { complete: true }); console.log(header.kid, header.alg); // compare with your JWKS / configured key - 3.
Deixar o depurador apontar a divergência
Cole o token e a chave pública no depurador de JWT: ele verifica ES256/ES384/ES512 localmente e distingue chave errada, payload adulterado e codificação de assinatura malformada, em vez de devolver um simples booleano.