Nest: Autenticación

Aprende a implementar autenticación en NestJS con esta guía detallada. Con ejemplos prácticos y recomendaciones, mantén tu aplicación segura.

La autenticación es un componente crítico en cualquier aplicación web, y NestJS ofrece varias herramientas y estrategias para implementar un sistema de autenticación robusto. En esta guía, exploraremos cómo configurar y utilizar autenticación en NestJS, desde la instalación de dependencias hasta la creación de estrategias personalizadas.

Instalación de dependencias

Primero, necesitamos instalar las dependencias necesarias. Para manejar la autenticación, utilizaremos @nestjs/passport, passport, y passport-local.

npm install @nestjs/passport passport passport-local
npm install --save-dev @types/passport-local

Configuración del módulo de autenticación

Creamos un módulo de autenticación que gestionará la lógica de autenticación. Para ello, generamos un nuevo módulo y servicio en NestJS:

nest generate module auth
nest generate service auth

Implementación de la estrategia local

La estrategia local es una de las más utilizadas para autenticación mediante nombre de usuario y contraseña. Configuramos la estrategia local creando un archivo local.strategy.ts en el módulo de autenticación.

import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super();
  }

  async validate(username: string, password: string): Promise<any> {
    const user = await this.authService.validateUser(username, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

En el servicio de autenticación, añadimos un método validateUser que verifica las credenciales del usuario.

import { Injectable } from '@nestjs/common';
import { UsersService } from '../users/users.service';

@Injectable()
export class AuthService {
  constructor(private usersService: UsersService) {}

  async validateUser(username: string, password: string): Promise<any> {
    const user = await this.usersService.findOne(username);
    if (user && user.password === password) {
      const { password, ...result } = user;
      return result;
    }
    return null;
  }
}

Creación del controlador de autenticación

El siguiente paso es crear un controlador que maneje las rutas de autenticación. Generamos un archivo auth.controller.ts en el módulo de autenticación.

import { Controller, Request, Post, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('auth')
export class AuthController {
  @UseGuards(AuthGuard('local'))
  @Post('login')
  async login(@Request() req) {
    return req.user;
  }
}

Protección de rutas

Para proteger rutas específicas dentro de la aplicación, utilizamos el guard AuthGuard de Passport. Por ejemplo, en un controlador de usuarios, añadimos el guard a las rutas que queremos proteger.

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('users')
export class UsersController {
  @UseGuards(AuthGuard('local'))
  @Get('profile')
  getProfile(@Request() req) {
    return req.user;
  }
}
Certifícate en Nest con CertiDevs PLUS

Lecciones de este módulo de Nest

Lecciones de programación del módulo Autenticación del curso de Nest.

Ejercicios de programación en este módulo de Nest

Evalúa tus conocimientos en Autenticación con ejercicios de programación Autenticación de tipo Test, Puzzle, Código y Proyecto con VSCode.