Implementación de JSON Web Tokens en APIs para Autenticación Segura

Clase 11 de 22Curso de NestJS: Autenticación con Passport y JWT

Resumen

¿Por qué implementar JSON Web Tokens (JWT) en nuestra API?

Implementar JSON Web Tokens es esencial para el manejo de la autenticación en APIs. Esta técnica permite que, una vez que el usuario haya iniciado sesión correctamente, se genere un token que le permita enviar solicitudes futuras. Los JWT son fundamentales para API porque transportan información encriptada que puede incluir, por ejemplo, el identificador del usuario y su rol. Además, los JWT ofrecen beneficios adicionales, como la posibilidad de ser utilizados en aplicaciones móviles Android e iOS, superando las limitaciones de cookies y sesiones que funcionan solo en navegadores.

¿Cómo instalar las dependencias necesarias para JWT?

Para trabajar con JWT en NestJS, primero necesitamos instalar algunas dependencias. Estas incluyen tanto las de uso general como las de tipado, que son exclusivamente para el desarrollo:

  1. Instalar las dependencias necesarias utilizando npm o yarn:
    npm install @nestjs/jwt
    
  2. Instalar las dependencias de desarrollo para el tipado:
    npm install --save-dev @types/express
    

Una vez instaladas, podemos proceder al desarrollo del servicio que gestionará nuestros JWT.

¿Cómo implementar el servicio de JSON Web Tokens?

La implementación del servicio JWT en nuestro sistema requiere unos pocos pasos específicos. Aquí, exploramos cómo hacerlo:

¿Cómo integrar JWT Service en el código?

  1. Importar la librería JWT de NestJS:

    import { JwtService } from '@nestjs/jwt';
    
  2. Inyectar el servicio JWT en nuestro servicio de autenticación:

    constructor(private readonly jwtService: JwtService) {}
    

¿Cómo generar un JWT?

Creamos un método dentro de nuestro servicio de autenticación que genere el token una vez que el usuario haya iniciado sesión correctamente:

  1. Crear un método con el usuario autenticado:
    import { User } from '../path/to/user.entity';
    
    function generateJWT(user: User) {
        const payload = { 
            role: user.role, 
            sub: user.id 
        };
        return {
            accessToken: this.jwtService.sign(payload),
            user,
        };
    }
    

¿Cómo tipar el payload del JWT?

Definir un payload tipado es esencial para manejar correctamente la información dentro del token:

  1. Crear un modelo para el token:
    interface PayloadToken {
        role: string;
        sub: number;
    }
    

¡Importante! ¿Cómo configurar la firma del JWT?

Finalmente, la firma del JWT necesita configurarse correctamente para garantizar la seguridad:

  1. Configurar JWT Module en el módulo de autenticación. Definir una llave secreta para firmar los tokens:
    JwtModule.register({
        secret: 'mi_llave_secreta',
        signOptions: { expiresIn: '60s' },
    });
    

Con esto, está configurado el método para generar un JWT. Sin embargo, en la siguiente clase veremos cómo integrar el JWT Module en el módulo de autenticación y cómo definir la llave secreta correctamente.