Mensagem de erro
"alg" (Algorithm) Header Parameter value not allowed
jose (JavaScript) — JOSEAlgNotAllowed, code ERR_JOSE_ALG_NOT_ALLOWED
O que significa
O cabeçalho alg do token indica um algoritmo que não está na lista de algoritmos permitidos que você passou para jwtVerify. A biblioteca jose recusa o token antes de qualquer operação criptográfica. Essa barreira é intencional: o cabeçalho alg é uma entrada controlada pelo atacante, e o verificador — não o token — é quem deve escolher o algoritmo.
Por que acontece
Lista de algoritmos permitidos fora de sincronia com o emissor
comumO emissor migrou de RS256 para ES256 (ou adicionou uma nova chave de assinatura com outro algoritmo) enquanto o verificador continua fixado na família de algoritmos antiga. Todo token novo falha até que a lista de algoritmos permitidos e as chaves sejam atualizadas juntas — e as falhas começam no minuto exato em que o emissor faz a troca, uma pista forense útil nos logs.
A lista de algoritmos permitidos escreve o nome do algoritmo de outra forma
ocasionalA comparação é uma correspondência exata, que diferencia maiúsculas de minúsculas, com o nome JOSE: “es256”, “ECDSA”, “P-256” ou “SHA256withECDSA” em um arquivo de configuração nunca correspondem a um cabeçalho que diz “ES256”. (Uma chave que não combina com o cabeçalho — uma chave P-384 para um token ES256, uma JWK cujo próprio alg é diferente — falha de outro jeito, com um TypeError que descreve a chave.)
Um cliente hostil ou mal configurado altera o alg
raraTokens que chegam com alg: “none” ou com um valor HS* inesperado são exatamente o que esta verificação existe para barrar. Se aparecerem algoritmos estranhos nos logs, trate isso como sondagem, e não como um bug a ser contornado.
Como corrigir
- 1.
Alinhar a lista de algoritmos permitidos, a chave e a configuração do emissor
Examine o cabeçalho e faça os três concordarem. Durante migrações, aceite os dois algoritmos temporariamente, cada um com a própria chave, selecionada pelo kid no JWKS.
js import { decodeProtectedHeader, jwtVerify } from "jose"; console.log(decodeProtectedHeader(token)); // { alg: "ES256", kid: "..." } await jwtVerify(token, jwks, { algorithms: ["ES256"] }); - 2.
Manter a lista de algoritmos permitidos o menor possível
Não “corrija” este erro listando todos os algoritmos. Um valor por tipo de token é o estado final seguro; a RFC 8725 (JWT Best Current Practices) diz o mesmo.
js // good: exactly what your issuer signs with { algorithms: ["ES256"] } // bad: defeats the protection this error provides { algorithms: ["ES256", "RS256", "HS256", "PS256"] }