Mensagem de erro
It is required that you pass in a value for the "algorithms" argument when calling decode().
PyJWT (Python) — jwt.exceptions.DecodeError
O que significa
Desde o PyJWT 2.0, jwt.decode() se recusa a rodar sem uma lista explícita de algoritmos. Isso não é preciosismo: derivar o algoritmo do próprio cabeçalho do token possibilita ataques de confusão de algoritmo (por exemplo, verificar um token HS256 usando uma chave pública RSA como segredo HMAC). O verificador — configurado no lado do servidor, fora do alcance do atacante — deve declarar o que aceita, e o PyJWT impõe esse contrato no nível da API, de modo que a forma insegura da chamada simplesmente não pode ser escrita.
Por que acontece
Código escrito para o PyJWT 1.x
comumO PyJWT 1.x permitia jwt.decode(token, key) e adivinhava o algoritmo. A versão 2.0 (2020) tornou o parâmetro algorithms obrigatório; qualquer atualização de dependência que cruze essa fronteira faz este erro aparecer em código que antes funcionava.
Um tutorial ou trecho de código gerado por LLM omitiu o parâmetro
comumMuitos exemplos antigos na web ainda mostram chamadas decode() com dois argumentos. O trecho de código roda sem problemas em ambientes fixados no PyJWT 1.x e falha em qualquer instalação atual.
Uma função auxiliar de autenticação compartilhada esconde a chamada de decodificação
ocasionalQuando um pequeno utilitário interno encapsula jwt.decode(), uma atualização do PyJWT quebra de uma vez todos os serviços que importam essa função auxiliar, e o traceback aponta para o wrapper, e não para o código que o chama. As integrações com frameworks (Flask-JWT-Extended, DRF SimpleJWT) passam a lista de algoritmos (algorithms) internamente — é nos wrappers feitos à mão que a omissão costuma estar.
Como corrigir
- 1.
Declarar o algoritmo explicitamente
Passe exatamente o algoritmo (ou os algoritmos) que seu emissor usa — para tokens assinados com ECDSA, normalmente ES256. Se vários tipos de token passam por um mesmo serviço, dê a cada emissor a própria lista de algoritmos permitidos, em vez de juntar todos em uma única lista permissiva.
python import jwt payload = jwt.decode( token, public_key_pem, algorithms=["ES256"], # required — and a security control, not boilerplate audience="api://orders", ) - 2.
Para inspeção sem verificação, deixar isso explícito
Se você só precisa ler as claims (depuração, logs), desative a verificação de forma deliberada — e nunca use o resultado em decisões de autorização.
python claims = jwt.decode(token, options={"verify_signature": False}) # or just the header: header = jwt.get_unverified_header(token)