Descodificar JWT en JavaScript o Node | Programador Web Valencia

Descodificar JWT en JavaScript o Node

2 minutos

Javascript

JSON Web Tokens (JWT) se utilizan comúnmente para autenticación y autorización en aplicaciones web y apps. Cuando un usuario inicia sesión, el servidor crea un token JWT y lo envía al cliente. El cliente puede almacenar el token en la memoria o en el almacenamiento local y enviarlo en cada solicitud para demostrar que está autorizado. Con ello, el backend puede verificar la validez del token y permitir o denegar el acceso a los recursos protegidos. Además, incluye información muy útil del cliente. Hablamos de un estándar de tokens de acceso basado en JSON (JavaScript Object Notation). Es un formato compacto y seguro para transmitir información de manera segura entre partes.

A continuación puedes ver un ejemplo clásico, un string comúnmente devuelvo al identificarte. Los desarrolladores de Apps están aburridos de verlo cuando el cliente hace login sobre Apple o Google.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJlbWFpbCI6ImNvcnJlb0BlamVtcGxvLmNvbSJ9.bSTW96-557UM0vV3fD3TTXtFZLBWjsTY5exzTA0Befw

Si lo separamos por puntos, nos encontramos 3 partes con objetivos diferentes.

1. La cabecera: Descripción del algoritmo y tipo de token.

Si descodificamos eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 nos encontraremos el tipo de algoritmo que se esta utilizando.

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload: La información.

Si descodificamos eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJlbWFpbCI6ImNvcnJlb0BlamVtcGxvLmNvbSJ9 veremos la información sobre el cliente o usuario.

{
  "id": "1234567890",
  "name": "John Doe",
  "email": "correo@ejemplo.com"
}

3. Verificación de firma: Comprueba que los datos no han sido manipulados.

Si descodificamos bSTW96-557UM0vV3fD3TTXtFZLBWjsTY5exzTA0Befw habrá un código para verificar la integridad de los datos.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),

)

¿Cómo puedo descodificarlo?

Para descodificarlo y obtener una previa puedes usar herramientas online como https://jwt.io/.

No obstante, si quieres ver su contenido desde el lado del cliente, usando JavaScript vainilla, puedes usar la siguiente función:

/**
 * Decode JWT (JSON Web Token - <https://jwt.io/>) to object
 * @param {string} token
 * @returns {object}
 */
function decodeJWT(token) {
    const base64Url = token.split('.')[1];
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    const jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
    return JSON.parse(jsonPayload);
}

Si ejecuto el string anterior obtendría el JSON que hemos puesto como ejemplo:

decodeJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJlbWFpbCI6ImNvcnJlb0BlamVtcGxvLmNvbSJ9.bSTW96-557UM0vV3fD3TTXtFZLBWjsTY5exzTA0Befw");
// { id: "1234567890", name: "John Doe", email: "correo@ejemplo.com" }

En caso de utilizar Node, también te proporciono un ejemplo más minimalista usando Buffer:

/**
 * Decode JWT (JSON Web Token - https://jwt.io/) to object
 * @param {string} token
 * @returns {object}
 */
function decodeJWT(token) {
    return JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
}

Para más información, librerías y aclaraciones técnicas puedes consultar https://jwt.io/introduction.

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me invitas a un café? ☕

Puedes hacerlo usando el terminal.

ssh customer@andros.dev -p 5555

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...