Mensagem de erro
The specified alg value is not allowed
Também aparece como
- jwt.exceptions.InvalidAlgorithmError: The specified alg value is not allowed
PyJWT (Python) — jwt.exceptions.InvalidAlgorithmError
O que significa
O `alg` do cabeçalho do token não está na lista `algorithms` que você passou para `jwt.decode()`. O PyJWT confere isso antes de verificar a assinatura, porque o cabeçalho é escolhido por quem produziu o token e não deve decidir como ele é verificado. O token pode estar corretamente assinado — só que com um algoritmo que você não permitiu.
Por que acontece
O emissor trocou de algoritmo
comumUma migração do provedor de RS256 para ES256 (ou a inclusão de uma chave EdDSA) quebra verificadores que fixam o valor antigo. As falhas começam exatamente na implantação da mudança e afetam apenas tokens recém-emitidos.
A JWK define um algoritmo diferente
ocasionalQuando você passa um `PyJWK` (por exemplo, vindo do `PyJWKClient`), o `alg` dele também restringe a verificação. Uma JWK marcada como RS256 não consegue verificar um token ES256.
Um token vindo de outro lugar
ocasionalTokens de outro emissor, um token HS256 interno enviado a uma API pública ou uma sondagem com `alg: "none"` ou `HS256` contra uma API protegida por RSA. Nesses casos, a rejeição está correta.
Como corrigir
- 1.
Ler o cabeçalho primeiro
`jwt.get_unverified_header()` mostra `alg` e `kid` sem confiar em nada. Compare o resultado com sua lista de algoritmos permitidos e com as chaves que seu emissor publica.
python print(jwt.get_unverified_header(token)) # {'alg': 'ES256', 'kid': '...', 'typ': 'JWT'} - 2.
Permitir exatamente o algoritmo do emissor
Coloque em `algorithms` o algoritmo que seu emissor usa e resolva as chaves a partir do JWKS dele. Durante uma migração, liste os dois algoritmos, cada um associado à própria chave pelo `kid`.
python from jwt import PyJWKClient jwks = PyJWKClient("https://issuer.example.com/.well-known/jwks.json") signing_key = jwks.get_signing_key_from_jwt(token) claims = jwt.decode( token, signing_key.key, algorithms=["ES256"], # the algorithm(s) your issuer actually uses, never the token's own header audience="https://api.example.com", )