Ferramentas / Decodificador de JWT

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.

Esta ferramenta não valida a assinatura. Não cole tokens de produção: use apenas tokens de teste.
-
-
-

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, expirou

Para 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