Clase 28 - Token - Validaciones - Hash
#token
#hash
#validation
#roles
#authorization
#authentication
#backend
app.module.ts
Tokens
- Son un estándar para el intercambio de información segura entre dos partes.
- Se utilizan para autenticar usuarios, autorizar acceso a recursos y rastrear transacciones.
- Los tokens se pueden almacenar en la memoria, en una cookie o en una base de datos (localStorage, Indexed DB).
- Los tokens se pueden encriptar para proteger la información confidencial.
JWT
JSON Web Token
- Se compone de 3 partes, cabecera, carga y firma (header, payload, signature).
- Se generan en el servidor con el fin de autenticar a los usuarios.
- Se envían al cliente y se almacenan en el navegador.
- Si el cliente quiere acceder a algún recurso con protección del servidor, debe proveer su JWT.

Authentication workflow

Authentication workflow + Refresh

Validaciones
- Aumentar la rigurosidad de nuestro backend.
- Proteger la integridad y seguridad de los datos.

¿Cómo aplicar validaciones?
- Utilizando JavaScript puro.
- Manejando expresiones regulares.
- Uso de bibliotecas externas.

Bibliotecas externas
- Características/Ventajas:
- Sencillez
- Personalización de mensajes de error
- Validación de tipos complejos
- Integración con otros frameworks
JOI, Yup, Zod, VineJs
// JOIimport Joi from 'joi';const schema = Joi.object({ name: Joi.string().required(), email: Joi.string().email().required(), age: Joi.number().min(18),});
const { error, value } = schema.validate({ name: 'Ana', email: 'ana@email.com', age: 25 });
// ZODimport { z } from 'zod';const schema = z.object({ name: z.string(), email: z.string().email(), age: z.number().min(18),});
const result = schema.safeParse({ name: 'Ana', email: 'ana@email.com', age: 25 });
// Yupimport * as yup from 'yup';const schema = yup.object({ name: yup.string().required(), email: yup.string().email().required(), age: yup.number().min(18),});
schema .validate({ name: 'Ana', email: 'ana@email.com', age: 25 }) .then(valid => console.log('Valid!', valid)) .catch(err => console.log('Validation error:', err.errors));
// VineJsimport vine from '@vinejs/vine'const schema = vine.object({ sku: vine.string(), price: vine.number().positive(), variants: vine.array( vine.object({ name: vine.string(), type: vine.enum(['size', 'color']), value: vine.string(), }) )})
const data = getDataToValidate()await vine.validate({ schema, data })class-validator y class-transformer
-
Para aprovechar que NestJS promueve una arquitectura basada en clases y decoradores, utilizaremos:
-
class-validator: Permite validar objetos basados en clases usando decoradores- Define reglas de validación de forma declarativa.
- Integra fácilmente con el sistema de DTOs de NestJS.
- Funciona automáticamente con
ValidationPipe.
-
class-transformer: Convierte datos planos (como JSON del body) en instancias de clases, permitiendo que los decoradores declass-validatorfuncionen:- Transforma automáticamente datos entrantes al tipo correcto (por ejemplo, de
stringanumber). - Se usa junto con
ValidationPipepara que NestJS valide correctamente los DTOs.
- Transforma automáticamente datos entrantes al tipo correcto (por ejemplo, de
class CreateUserDto { @IsEmail() email: string;
@Length(6, 20) password: string;}
// main.tsapp.useGlobalPipes(new ValidationPipe({ transform: true }));Esto permite que:
- Nest convierta automáticamente el body en una instancia de la clase DTO (
class-transformer). - Valide esa instancia con las reglas de decoradores (
class-validator).
Nota: también es posible usarlo en el app.module.ts
- Recomendado si prefieres centralizar la configuración a través del sistema de módulos de NestJS
- Permite inyectar dependencias si tu pipe personalizado lo requiere
import { ValidationPipe } from '@nestjs/common';
@Module({ imports: [MODULOS DEL PROYECTO], providers: [ { provide: APP_PIPE, useClass: ValidationPipe, }, ],})export class AppModule {}Encriptación/Hash
- Protección frente a brechas de seguridad.
- Seguridad adicional para usuarios con contraseñas débiles.
- Prevención de ataques de fuerza bruta.
- Salting para mayor seguridad.
- Generación de confianza para los usuarios.
