Firma y Verificación de JSON Web Tokens con JavaScript

Clase 9 de 20Curso de Backend con Node.js: Autenticación con Passport.js y JWT

Resumen

¿Qué son y cómo funcionan los JSON Web Tokens en JavaScript?

JSON Web Tokens (JWT) son un estándar de seguridad usado para compartir información de manera segura entre dos partes. Estos tokens contienen información codificada que puede ser desencriptada por el receptor si tiene el secreto correcto. En esta guía, aprenderemos a generar, firmar y verificar un JWT utilizando la librería JSON Web Token en Node.js, comprendiendo su estructura y manejo adecuado.

¿Cómo instalar y utilizar la librería JSON Web Token?

Instalar y usar la librería JSON Web Token en Node.js es un proceso esencial para trabajar con JWT.

  1. Instala la librería usando npm:

    npm install jsonwebtoken
    
  2. Importa y prepara la librería en tus archivos de JavaScript:

    const jwt = require('jsonwebtoken');
    
  3. Defina un segredo, que debería almacenarse como una variable de entorno para garantizar la seguridad:

    const secret = 'mySecretKey';
    

¿Cómo generar y firmar un JSON Web Token?

Para generar un JWT, es crucial definir qué datos deben codificarse dentro del token. Aquí te mostramos cómo firmar un token:

  1. Define el payload. Este es el conjunto de datos que se incluirán en el token:

    const payload = {
      sub: 1,
      scope: 'customer'
    };
    
  2. Crea una función para firmar el token:

    function signToken(payload, secret) {
      return jwt.sign(payload, secret);
    }
    
  3. Genera el token y observa las partes que lo conforman:

    const token = signToken(payload, secret);
    console.log(token);
    

El token generado constará de tres partes: cabecera, payload y firma. Solo el backend que posee el secreto puede verificar esta firma, garantizando que el token es auténtico y no ha sido alterado.

¿Cómo verificar y asegurar un JSON Web Token?

La verificación de un JWT es fundamental para garantizar que el token es válido y no ha sido alterado.

  1. Crea una función para verificar el token, pasando el token y el secreto:

    function verifyToken(token, secret) {
      try {
        const data = jwt.verify(token, secret);
        console.log(data);
      } catch (err) {
        console.error('Invalid token');
      }
    }
    
  2. Usar el token generado para verificarlo:

    verifyToken(token, secret);
    

Si la verificación es correcta, se accede a los datos encapsulados en el payload. Si ocurre un error de verificación, indica que el secreto o el token son incorrectos.

¿Cuáles son las mejores prácticas para manejar JWT?

Aquí te ofrecemos algunas recomendaciones para trabajar eficazmente con JWT:

  • No almacenar información sensible en el payload: Cualquier usuario puede decodificar el payload, por lo que no es seguro para datos sensibles.
  • Manejar el secreto prudentemente: El secreto solo debe ser conocido por el backend. Almacénalo como una variable de entorno y nunca en el código fuente.
  • Implementar un sistema de expiración y actualización de tokens: Usa tokens de actualización (refresh tokens) para generar nuevos tokens cada cierto tiempo, mejorando la seguridad.
  • Limitar el tiempo de vida del token: Define una expiración breve para los tokens de acceso, mejorando la seguridad en caso de que un token sea comprometido.

Finalmente, recuerda que la seguridad de JWT se basa en la gestión del secreto y la aplicación de las mejores prácticas, como la rotación de tokens y el uso de tokens de actualización. Aprende y aplica correctamente estos principios y herramientas para proteger tus aplicaciones. ¡Sigue explorando y aprendiendo sobre el desarrollo seguro!