MiServe DevTools

Os seus autocolantes

Fixe aqui as ferramentas. Ficam guardadas neste navegador.

Descodificar, verificar e assinar JWT

Descodifique um JSON Web Token, leia as claims e a expiração, verifique a assinatura com um segredo ou uma chave pública e assine tokens HMAC.

Funciona no seu navegador. Nada do que cola é enviado.

Sobre esta ferramenta

O que é um JWT

Um JSON Web Token assinado (RFC 7519) é composto por três strings Base64URL unidas por pontos: um cabeçalho, um payload e uma assinatura. O cabeçalho indica como o token é assinado (alg). O payload é um objeto JSON de claims, afirmações como a quem se refere o token (sub), quem o emitiu (iss) e quando expira (exp). A assinatura é calculada sobre as duas primeiras partes.

Descodificar não é verificar. O cabeçalho e o payload estão apenas codificados, não encriptados: qualquer pessoa que tenha um token pode lê-lo, como esta página faz sem qualquer chave, e qualquer pessoa pode escrever um token com as claims que quiser. Nunca coloque um segredo no payload de um JWT e nunca confie numa claim antes de a assinatura ter sido verificada.

Verificar a assinatura

HS256, HS384 e HS512 são HMAC: o mesmo segredo assina e verifica, por isso quem consegue verificar também consegue falsificar. RS256, PS256 e ES256 e as respetivas variantes 384 e 512 são assimétricos: o emissor assina com uma chave privada e a verificação faz-se com a chave pública, que muitas vezes é publicada como JWK Set no jwks_uri do emissor.

Cole o segredo, ou a chave pública em PEM, como certificado X.509 ou como JWK. A verificação é feita pela Web Crypto API do seu navegador. O resultado é um de três: a assinatura é válida, é inválida, ou não pôde ser verificada. Neste último caso, a página indica o motivo: não há chave, a chave tem o tipo ou a curva errados, o algoritmo não é suportado, ou o cabeçalho diz "alg": "none", o que significa que o token nem sequer está assinado.

Uma assinatura válida é necessária, mas não suficiente. Um serviço real também tem de verificar a expiração, o emissor e a audiência, e tem de decidir por si próprio que algoritmo aceita, em vez de confiar no cabeçalho do token.

Datas, o token de exemplo e a assinatura

exp, nbf e iat são timestamps Unix em segundos. A tabela de claims mostra-os como datas no seu fuso horário, e o indicador por cima dela diz se o token expirou, se ainda não é válido ou durante quanto tempo continua válido, segundo o relógio do seu dispositivo.

A página abre com um token de exemplo criado no seu navegador, emitido agora e válido durante uma hora. Está assinado com HS256 e com o segredo de exemplo devtools-sample-secret-not-for-production, e é por isso que a assinatura é válida. Esse segredo é público: não o use para nada real.

Assinar cria um token a partir do cabeçalho e do payload que editar e de um segredo HMAC. Use-o para testes e desenvolvimento local. Os tokens, segredos e chaves que introduzir ficam neste separador: nada é enviado, guardado ou registado.

Perguntas

É seguro colar um JWT aqui?

O token é descodificado e verificado por JavaScript no seu navegador e não é enviado para um servidor. Mesmo assim, um token que ainda não expirou é uma credencial válida, por isso tenha cuidado com qualquer ferramenta que lhe peça um e prefira tokens expirados ou de teste.

Qualquer pessoa pode ler o conteúdo de um JWT?

Sim. O cabeçalho e o payload são JSON codificado em Base64URL, não encriptado, por isso qualquer pessoa que tenha o token os pode ler sem chave. A assinatura não esconde nada: apenas mostra que o token foi criado por alguém que tem a chave de assinatura e que não foi alterado depois.

Qual é a diferença entre HS256 e RS256?

O HS256 usa um único segredo partilhado para assinar e verificar, por isso qualquer parte que verifique também pode criar tokens. O RS256 usa uma chave privada para assinar e uma chave pública para verificar, o que permite que muitos serviços verifiquem tokens que só o emissor pode criar.

Porque é que o meu token aparece como expirado?

A claim exp indica um momento no passado, segundo o relógio do seu dispositivo. Alguns servidores toleram uma pequena diferença de relógio, mas um token expirado tem de ser substituído, iniciando sessão novamente ou usando um refresh token.

Mais ferramentas de Codificação