Decodificador de JWT
Cole um token JWT para ver o header, o payload e as datas de emissão e expiração. Tudo no seu navegador.
-
-
Processamento local: nada do que você digita sai do seu navegador.
Como usar
Cole o token (com ou sem o prefixo Bearer) na caixa. O header e o payload aparecem decodificados na hora, junto com as datas de iat (emitido em), nbf (válido a partir de) e exp (expira em), e um aviso se o token já expirou.
O que é um JWT
Um JWT tem três partes separadas por ponto: header, payload e assinatura. Header e payload são apenas JSON codificado em Base64URL, ou seja, qualquer pessoa consegue ler. Por isso nunca coloque senhas ou dados sigilosos no payload.
Importante
- Esta ferramenta não valida a assinatura: decodificar não prova que o token é autêntico.
- Evite colar tokens de produção em qualquer site. Use tokens de teste ou já expirados.
- A validação real deve ser feita no servidor, com a chave correta.
Como implementar em código
Exemplos prontos para usar no seu projeto.
// Decodifica header e payload de um JWT (NÃO valida a assinatura)
function decodificarJwt(token) {
const b64 = (s) => {
const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));
const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));
return JSON.parse(new TextDecoder().decode(bytes));
};
const [h, p] = token.split('.');
const payload = b64(p);
const expirou = typeof payload.exp === 'number' && payload.exp * 1000 < Date.now();
return { header: b64(h), payload, expirou };
}Para validar a assinatura use uma biblioteca, como jose ou jsonwebtoken.
import base64, json, time
def parte(s):
s += "=" * (-len(s) % 4) # restaura o padding do Base64
return json.loads(base64.urlsafe_b64decode(s))
def decodificar_jwt(token):
h, p, _ = token.split(".")
payload = parte(p)
expirou = payload.get("exp", float("inf")) < time.time()
return parte(h), payload, expirouPara validar a assinatura use PyJWT (jwt.decode com a chave).
package main
import (
"encoding/base64"
"encoding/json"
"strings"
"time"
)
// Decodifica o payload e informa se o token expirou (sem validar assinatura).
func decodificarJwt(token string) (map[string]any, bool, error) {
partes := strings.Split(token, ".")
if len(partes) != 3 {
return nil, false, base64.CorruptInputError(0)
}
raw, err := base64.RawURLEncoding.DecodeString(partes[1])
if err != nil {
return nil, false, err
}
var payload map[string]any
if err := json.Unmarshal(raw, &payload); err != nil {
return nil, false, err
}
exp, ok := payload["exp"].(float64)
return payload, ok && int64(exp) < time.Now().Unix(), nil
}Para validar a assinatura use github.com/golang-jwt/jwt.
import 'dart:convert';
Map<String, dynamic> parte(String s) =>
jsonDecode(utf8.decode(base64Url.decode(base64Url.normalize(s))))
as Map<String, dynamic>;
/// Decodifica o payload e informa se expirou (sem validar a assinatura).
({Map<String, dynamic> payload, bool expirou}) decodificarJwt(String token) {
final partes = token.split('.');
final payload = parte(partes[1]);
final exp = payload['exp'];
final expirou =
exp is num && exp * 1000 < DateTime.now().millisecondsSinceEpoch;
return (payload: payload, expirou: expirou);
}Requer Dart 3 (records). Para validar a assinatura use o pacote dart_jsonwebtoken.
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Jwt {
// Retorna o JSON (texto) de uma parte do token: 0 = header, 1 = payload
static String parte(String token, int indice) {
String[] partes = token.split("\\.");
byte[] bytes = Base64.getUrlDecoder().decode(partes[indice]);
return new String(bytes, StandardCharsets.UTF_8);
}
// Leia o JSON com Jackson/Gson e compare "exp" com
// java.time.Instant.now().getEpochSecond()
}Para validar a assinatura use java-jwt (Auth0) ou jjwt.
<?php
// Decodifica header e payload de um JWT (NÃO valida a assinatura)
function decodificarJwt(string $token): array {
[$h, $p] = explode('.', $token);
$dec = fn(string $s) => json_decode(
base64_decode(strtr($s, '-_', '+/')), true
);
$payload = $dec($p);
$expirou = isset($payload['exp']) && $payload['exp'] < time();
return ['header' => $dec($h), 'payload' => $payload, 'expirou' => $expirou];
}Para validar a assinatura use firebase/php-jwt.
using System;
using System.Text.Json;
static JsonDocument DecodificarParte(string token, int indice)
{
var p = token.Split('.')[indice].Replace('-', '+').Replace('_', '/');
p = p.PadRight(p.Length + (4 - p.Length % 4) % 4, '='); // restaura o padding
return JsonDocument.Parse(Convert.FromBase64String(p));
}
// Exemplo: verificar se expirou (sem validar a assinatura)
// var doc = DecodificarParte(token, 1);
// bool expirou = doc.RootElement.TryGetProperty("exp", out var e)
// && e.GetInt64() < DateTimeOffset.UtcNow.ToUnixTimeSeconds();Para validar a assinatura use System.IdentityModel.Tokens.Jwt.
Perguntas frequentes
O token é enviado para algum servidor?
Não. A decodificação acontece no seu navegador com JavaScript. Mesmo assim, evite colar tokens de produção em qualquer ferramenta.
Por que não valida a assinatura?
Validar exige a chave secreta ou pública do emissor, que não deve ser colada em um site. Esta ferramenta serve para inspecionar o conteúdo, não para provar a autenticidade.
Como é calculado se o token expirou?
Comparamos o campo exp (segundos desde 1970) com a hora atual do seu dispositivo. Se exp for menor ou igual a agora, o token está expirado.
Veja também
Precisa de um sistema ou app sob medida?
A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.
Fale com a VcInova