Estrategia y Guardia de Autenticación con JWT en NestJS
Clase 13 de 22 • Curso de NestJS: Autenticación con Passport y JWT
Resumen
¿Cómo asegurar la comunicación entre APIs utilizando tokens de acceso?
Los tokens de acceso son una pieza clave para mantener la seguridad en la comunicación entre APIs y clientes. En este contexto, una de las técnicas utilizadas es la implementación de estrategias de autenticación basadas en JWT (JSON Web Token), permitiendo validar la identidad y los permisos de los usuarios.
¿Cómo crear una estrategia para validar JWT?
Para garantizar que cada request a nuestra API esté debidamente autentificado, creamos una strategy
que se encargue de validar el JWT. Esta se asegurará de que el token no haya expirado y sea válido, utilizando la siguiente estructura:
-
Creación de la estrategia: Utilizamos una
JWT strategy
que verificará la integridad del token. Esto involucra configurar parámetros como desde dónde se tomará el token (habitualmente desde elheader
) y asegurarse de que el token sea unBearer token
.import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor(private configService: ConfigService) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreExpiration: false, secretOrKey: configService.get<string>('JWT_SECRET'), }); } async validate(payload: any) { return { userId: payload.sub, role: payload.role }; } }
-
Configurar el guardián: Al crear un guardián (
guard
), podemos proteger ciertos endpoints exigendo la presencia de un token válido. Esto asegura que solo requests autorizados accedan a los datos o servicios:import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; @UseGuards(JwtAuthGuard) @Get('protected') getProtectedData() { return this.productService.getAll(); }
¿Cómo implementar la validación de tokens en los endpoints?
Una vez implementada la strategy
, es inmediata la aplicación sobre los endpoints que requerimos proteger:
-
Proteger rutas específicas: Al estar una ruta protegida, requiere que el request venga acompañado de un token válido. Los clientes de la API deben asegurarse de enviar este token en cada solicitud.
-
Validar tokens en cada solicitud: Es fundamental que cada endpoint verifique el token, lo cual asegura que el acceso sea controlado y se restrinja solo a usuarios autorizados, limitando brechas de seguridad.
¿Qué ventajas ofrece la tokenización de requests en APIs?
El uso de tokens no solo eleva el nivel de seguridad, sino que también ofrece otras ventajas prácticas:
-
Autenticación centralizada: Facilita la gestión de roles y permisos desde un único punto, favoreciendo la escalabilidad.
-
Integración sencilla con múltiples plataformas: Clientes web, móviles, o incluso dispositivos IoT pueden incorporar fácilmente el token, garantizando autenticidad desde diversos entornos.
-
Control granular de acceso: Permite definir con precisión qué acciones puede llevar a cabo un usuario, mejorando la gestión de recursos y privilegios.
Adoptar estos mecanismos no solo robustece la seguridad de nuestras aplicaciones, sino que también mejora la confiabilidad del sistema, proporcionando un entorno seguro y eficiente para los usuarios. Este camino fomenta el aprendizaje continuo, instando a desarrolladores a explorar más a fondo las herramientas a su disposición para construir aplicaciones seguras y escalables.