Mensagem de erro
invalid algorithm
O que significa
O valor do cabeçalho alg do token não está na lista de algoritmos que seu verificador aceita. O jsonwebtoken verifica isso antes de mexer na assinatura, então o token pode estar perfeitamente assinado — só que com um esquema que você não permitiu. Essa barreira é um recurso de segurança funcionando como projetado, e não um bug de análise.
Por que acontece
Emissor e verificador discordam depois de uma migração
comumO emissor trocou RS256 por ES256 (ou o contrário), mas o verificador ainda fixa o valor antigo na lista de algoritmos permitidos. Assim, todo token novo falha enquanto os antigos em cache continuam passando, o que faz a implantação parecer intermitente.
Lista de algoritmos permitidos deduzida do tipo de chave errado
comumDesde a v9, quando você não passa a opção algorithms, o jsonwebtoken deduz a lista de algoritmos permitidos a partir da chave: passe uma chave pública RSA e tokens ES256 serão “invalid algorithm”, mesmo que você quisesse permiti-los. Passar uma chave EC permitindo só RS256 falha do mesmo jeito. (Uma chave RSA com algorithms: ["ES256"] passa por essa verificação e falha na seguinte, com “"alg" parameter for "rsa" key type must be one of: RS256, PS256, …”.)
Um token de outro emissor
ocasionalSistemas multilocatários às vezes recebem tokens gerados por outro provedor de identidade com um esquema de assinatura diferente. A divergência de alg é então um sintoma — o problema real é que o token nem deveria chegar a este verificador.
Como corrigir
- 1.
Fixar a lista de algoritmos permitidos no que o emissor realmente usa
Decodifique o cabeçalho para ver o alg real e defina a lista de algoritmos permitidos exatamente com esse valor — e confirme que o tipo da chave corresponde (chave EC para ES256, chave RSA para RS256).
js const { header } = jwt.decode(token, { complete: true }); console.log(header.alg); // e.g. "ES256" jwt.verify(token, ecPublicKeyPem, { algorithms: ["ES256"] }); - 2.
Implantar mudanças de algoritmo em duas fases
Durante uma rotação de chave ou de algoritmo, os verificadores precisam aceitar os dois esquemas por um curto período — cada um vinculado à própria chave pelo kid — e depois voltar a aceitar apenas um.
js // transition window only: jwt.verify(token, keyForKid(header.kid), { algorithms: ["ES256", "RS256"] }); // after all RS256 tokens expired: jwt.verify(token, ecPublicKeyPem, { algorithms: ["ES256"] });