NestJS

Nest

Tutorial Nest: Iniciar sesión método de login

Nest login JWT: autenticación y seguridad. Aprende a implementar autenticación y seguridad utilizando JWT en Nest con ejemplos prácticos.

Introducción

Crear un método para autenticar usuarios (login).

Este verifica la existencia de un usuario y si sus credenciales son correctas entonces genera un Token JWT para el acceso a los controladores para ese usuario.

Instalar librerías

Instalar las librerías de autenticación y generación de tokens JWT, además de bcrypt para verificar contraseñas cifradas:

npm install @nestjs/jwt @nestjs/passport passport passport-jwt bcrypt

Configurar JwtModule

Este módulo proporciona un servicio JwtService para crear tokens JWT firmados con clave secreta. En el archivo app.module.ts configuramos este módulo:

@Module({
  imports: [
    PassportModule, // módulo de autenticación
    JwtModule.register({
      secret: 'admin',
      signOptions: {expiresIn: '7d'}
    }),

  ],
  controllers: [AuthenticationController],
  providers: [],
  })
export class AppModule {}

La clave secreta en este ejemplo es ‘admin’, lo aconsejable es cambiarla por una clave segura, que se puede generar con un script js independiente.

Crear archivo secrets.js con código JavaScript para generar claves seguras:

/*
Script para generar una clave secreta segura para creación de tokens JWT:
2 bytes = 256 bits

Ejemplo:
141adb5ed1bfba15da8298f2cd7bc88e84289a533c4057b1fa9340ce02a03943


Almacenar la clave en una variable de entorno.

Las variables de entorno se acceden en NestJS:

 JwtModule.register({
      secret: process.env.SECRETO,
      signOptions: {expiresIn: '7d'}
    }),
*/

const crypto = require('crypto');
const secret = crypto.randomBytes(32).toString('hex'); 
console.log(secret);

Ejecutar el archivo y generar una clave secreta. Después utilizar esa clave en la configuración del módulo JWT anterior.

Método de login

Crear interfaz login.dto.ts para recibir las credenciales del usuario en el login:

export interface Login {
    email: string; // también podría ser el username o nickname
    password: string;
}

En el controlador AuthenticationController creamos un método de login:

     constructor(
        @InjectRepository(User) private userRepository: Repository<User>,
        private jwtService: JwtService
    ) {}
    
    @Post('login')
    async login(@Body() login: Login) {

        // comprobar si el email existe
        const exists = await this.userRepository.existsBy({
            email: login.email
        });
        if(!exists)
            throw new NotFoundException("Usuario no encontrado."); // 404 

        // Recuperar el usuario
        const user = await this.userRepository.findOne({
            where: {
                email: login.email
            }
        });

        // Comparar contraseñas
        // IMPORTANTE: la contraseña de base de datos está CIFRADA con bcrypt
        //if (user.password !== login.password) {
        if (! bcrypt.compareSync(login.password, user.password)) {
            throw new UnauthorizedException("Credenciales incorrectas."); // 401
        }

        // Crear y devolver token de acceso (JWT)
        let userData = {
            sub: user.id,
            email: user.email,
            role: user.role
            // agregar más información si se necesita
        };

        let token = {
            token: await this.jwtService.signAsync(userData)
        }
        return token;

    }

Recepción del token

Una aplicación frontend debería tener un formulario de login que llame al método login del controlador de NestJS.

Por ejemplo en Angular podría ser login.component.ts.

Ejemplo de petición de login:

Una vez completado el login, el frontend recibe un token JWT, ejemplo de respuesta de login:

Ejemplo de token JWT obtenido:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImVtYWlsIjoidXNlcjFAZ21haWwuY29tIiwicm9sZSI6ImFk.....

Verificar token JWT

En jwt.io se puede comprobar el token y su estructura interna:

Certifícate en Nest con CertiDevs PLUS

Ejercicios de esta lección Iniciar sesión método de login

Evalúa tus conocimientos de esta lección Iniciar sesión método de login con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de Nest

Accede a todas las lecciones de Nest y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Certificados de superación de Nest

Supera todos los ejercicios de programación del curso de Nest y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Configurar la seguridad JWT en NestJS
  • Generar una clave secreta para firmar token JWT
  • Generar token JWT en login
  • Realizar login de usuarios (autenticar usuarios)