Depurador de JWT
Um 401 com um token que parece certo quase sempre é uma de seis coisas. Esta página mostra o token do jeito que o servidor o lê, para você descobrir qual delas é.
Assine um token seu para testar um endpoint. Tudo é calculado nesta página.
A chave e o token pronto ficam no seu navegador: nada é enviado a lugar nenhum e nada disso vai em um link compartilhado.
Verifique este token no seu próprio código. O trecho segue o algoritmo do cabeçalho.
Depurar um JSON Web Token que está sendo recusado
Tokens falham de poucas maneiras, e nenhuma delas é visível no token em si — são três pedaços de Base64URL com pontos no meio. Cole aqui e ele vira algo com que se pode discutir: cada campo do cabeçalho e cada claim, numa tabela que diz para que servem, com a expiração traduzida em palavras claras e a assinatura conferida contra a chave que você tiver.
Ele é decodificado enquanto você digita, e nada é enviado a lugar nenhum. Numa página assim isso merece ser dito sem rodeios, porque o que você está prestes a colar é uma credencial em funcionamento da conta de alguém.
As seis falhas, na ordem que vale a pena
| O que deu errado | Como aparece aqui | Correção |
|---|---|---|
| Expirado | A linha acima do cabeçalho diz "Expirou…" | Renove o token; se for questão de segundos, confira os relógios |
| Audiência errada | aud nomeia outra API | Peça o token para a audiência que a API espera |
| Emissor errado | iss é a URL de staging, não a de produção | Aponte o cliente para o emissor certo, ou a API para o dela |
| Chave errada | Verificar diz que a assinatura não confere | Use a chave com que o emissor assinou; cuidado com segredos em Base64 |
| Algoritmo errado | O cabeçalho diz ES256 e a sua chave é RSA | Combine a chave com o algoritmo mostrado ao lado do campo da chave |
| Não é um JWS | A página o chama de JWE, com cinco partes | O conteúdo está criptografado; leia onde estiver a chave de descriptografia |
A ordem importa. Expiração e audiência não exigem chave nem a colaboração de ninguém, então saem do caminho em segundos; perseguir um problema de assinatura que acaba sendo um aud trocado é como uma tarde inteira some.
Ler não é verificar
É esta a distinção que pega as pessoas. Decodificar diz o que um token afirma; não diz nada sobre isso ser verdade, porque o cabeçalho e o payload estão codificados, não criptografados, e qualquer um pode escrever os seus. Verificar é recalcular a assinatura com o segredo ou a chave pública do emissor — o que esta página faz no seu navegador — e é o único passo que transforma uma afirmação em fato.
Use então a visão decodificada para formar uma hipótese e o botão Verificar para testá-la, e nunca deixe uma decisão de autorização no seu próprio código se apoiar em conteúdo decodificado. A aba Código imprime a verificação do lado do servidor em oito linguagens exatamente por isso. Se o que confunde é a codificação em si, a diferença entre Base64 e Base64URL explica por que um segmento de JWT não pode ser simplesmente colado num decodificador Base64 comum.
Coisas que parecem problemas do token e não são
- A palavra
Bearercopiada junto com o token, ou uma quebra de linha vinda do terminal — os dois mudam a entrada assinada e quebram a assinatura. - Um token cortado por um visualizador de logs. O segmento da assinatura tem tamanho fixo por algoritmo, então um truncado falha sempre.
- Dois serviços que dividem um segredo e um deles o guarda em Base64. Marque O segredo está em Base64 para reproduzir esse lado.
- Um
kidque não existe mais porque o emissor girou as chaves; o token está bom, o conjunto de chaves é que está velho.
Descartado o token, os suspeitos restantes estão no servidor: um middleware que nunca valida, um relógio que desliza, um cache com um conjunto de chaves antigo. Se você precisa de um token num estado conhecido para testar qualquer disso — expirado, válido, assinado com uma chave sua —, o gerador de JWT monta um, e o verificador de expiração explica como um verificador lê as claims de tempo.