Sistema NEXUS v3.4 migrado con: Estructura principal: - core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles) - core/catalog: Catalogo de funcionalidades reutilizables - shared/knowledge-base: Base de conocimiento compartida - devtools/scripts: Herramientas de desarrollo - control-plane/registries: Control de servicios y CI/CD - orchestration/: Configuracion de orquestacion de agentes Proyectos incluidos (11): - gamilit (submodule -> GitHub) - trading-platform (OrbiquanTIA) - erp-suite con 5 verticales: - erp-core, construccion, vidrio-templado - mecanicas-diesel, retail, clinicas - betting-analytics - inmobiliaria-analytics - platform_marketing_content - pos-micro, erp-basico Configuracion: - .gitignore completo para Node.js/Python/Docker - gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git) - Sistema de puertos estandarizado (3005-3199) Generated with NEXUS v3.4 Migration System EPIC-010: Configuracion Git y Repositorios
284 lines
6.8 KiB
Markdown
284 lines
6.8 KiB
Markdown
# Autenticación y Autorización
|
|
|
|
**Versión:** 1.0.0
|
|
**Origen:** projects/gamilit
|
|
**Estado:** Producción
|
|
**Última actualización:** 2025-12-08
|
|
|
|
---
|
|
|
|
## Descripción
|
|
|
|
Sistema completo de autenticación y autorización basado en JWT con:
|
|
- Registro y login de usuarios
|
|
- Tokens de acceso y refresh
|
|
- Gestión de sesiones
|
|
- Guards y decoradores
|
|
- Sistema de roles (RBAC)
|
|
- Recuperación de contraseña
|
|
- Verificación de email
|
|
|
|
---
|
|
|
|
## Características
|
|
|
|
| Característica | Descripción |
|
|
|----------------|-------------|
|
|
| JWT Access Tokens | Tokens de corta duración (15min) para autenticación |
|
|
| JWT Refresh Tokens | Tokens de larga duración (7d) para renovación |
|
|
| Password Hashing | bcrypt con cost 10 |
|
|
| Session Management | Sesiones persistentes en BD con metadata |
|
|
| Role-Based Access | Sistema RBAC con guards y decoradores |
|
|
| Multi-tenant | Soporte para múltiples tenants |
|
|
| Security Logging | Registro de intentos de autenticación |
|
|
|
|
---
|
|
|
|
## Stack Tecnológico
|
|
|
|
```yaml
|
|
backend:
|
|
framework: NestJS
|
|
orm: TypeORM
|
|
auth_library: "@nestjs/passport"
|
|
jwt_library: "@nestjs/jwt"
|
|
hashing: bcrypt
|
|
validation: class-validator
|
|
|
|
database:
|
|
engine: PostgreSQL
|
|
schemas:
|
|
- auth (usuarios principales)
|
|
- auth_management (perfiles, sesiones, tokens)
|
|
```
|
|
|
|
---
|
|
|
|
## Dependencias NPM
|
|
|
|
```json
|
|
{
|
|
"@nestjs/jwt": "^10.x",
|
|
"@nestjs/passport": "^10.x",
|
|
"passport": "^0.7.x",
|
|
"passport-jwt": "^4.x",
|
|
"bcrypt": "^5.x",
|
|
"class-validator": "^0.14.x",
|
|
"class-transformer": "^0.5.x"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Tablas Requeridas
|
|
|
|
| Schema | Tabla | Propósito |
|
|
|--------|-------|-----------|
|
|
| auth | users | Usuarios del sistema |
|
|
| auth_management | profiles | Perfiles extendidos |
|
|
| auth_management | tenants | Multi-tenancy |
|
|
| auth_management | roles | Definición de roles |
|
|
| auth_management | user_roles | Asignación de roles |
|
|
| auth_management | user_sessions | Sesiones activas |
|
|
| auth_management | auth_attempts | Log de intentos |
|
|
| auth_management | password_reset_tokens | Tokens de reset |
|
|
| auth_management | email_verification_tokens | Tokens de verificación |
|
|
|
|
---
|
|
|
|
## Estructura del Módulo
|
|
|
|
```
|
|
auth/
|
|
├── auth.module.ts # Módulo principal
|
|
├── controllers/
|
|
│ ├── auth.controller.ts # Login, register, refresh
|
|
│ ├── password.controller.ts # Reset, change password
|
|
│ └── users.controller.ts # Profile, preferences
|
|
├── services/
|
|
│ ├── auth.service.ts # Lógica de autenticación
|
|
│ ├── session-management.service.ts
|
|
│ ├── security.service.ts
|
|
│ ├── password-recovery.service.ts
|
|
│ └── email-verification.service.ts
|
|
├── entities/
|
|
│ ├── user.entity.ts
|
|
│ ├── profile.entity.ts
|
|
│ ├── tenant.entity.ts
|
|
│ ├── role.entity.ts
|
|
│ ├── user-role.entity.ts
|
|
│ ├── user-session.entity.ts
|
|
│ ├── auth-attempt.entity.ts
|
|
│ └── ...
|
|
├── dto/
|
|
│ ├── login.dto.ts
|
|
│ ├── register-user.dto.ts
|
|
│ ├── refresh-token.dto.ts
|
|
│ ├── change-password.dto.ts
|
|
│ └── ...
|
|
├── guards/
|
|
│ ├── jwt-auth.guard.ts
|
|
│ └── roles.guard.ts
|
|
├── strategies/
|
|
│ └── jwt.strategy.ts
|
|
├── decorators/
|
|
│ └── roles.decorator.ts
|
|
└── __tests__/
|
|
├── auth.controller.spec.ts
|
|
├── auth.service.spec.ts
|
|
└── ...
|
|
```
|
|
|
|
---
|
|
|
|
## Endpoints Principales
|
|
|
|
| Método | Ruta | Descripción | Auth |
|
|
|--------|------|-------------|------|
|
|
| POST | /auth/register | Registro público | No |
|
|
| POST | /auth/login | Login con email/password | No |
|
|
| POST | /auth/refresh | Renovar access token | Refresh Token |
|
|
| POST | /auth/logout | Cerrar sesión | JWT |
|
|
| GET | /auth/me | Obtener usuario actual | JWT |
|
|
| POST | /auth/change-password | Cambiar contraseña | JWT |
|
|
| POST | /auth/request-reset | Solicitar reset password | No |
|
|
| POST | /auth/reset-password | Reset con token | Token |
|
|
|
|
---
|
|
|
|
## Uso Rápido
|
|
|
|
### 1. Proteger una ruta con JWT
|
|
|
|
```typescript
|
|
import { Controller, Get, UseGuards, Request } from '@nestjs/common';
|
|
import { JwtAuthGuard } from '@/modules/auth/guards';
|
|
|
|
@Controller('protected')
|
|
export class ProtectedController {
|
|
@Get()
|
|
@UseGuards(JwtAuthGuard)
|
|
getProtectedData(@Request() req) {
|
|
// req.user contiene el payload del JWT
|
|
return { userId: req.user.id, email: req.user.email };
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2. Proteger por roles
|
|
|
|
```typescript
|
|
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
import { JwtAuthGuard, RolesGuard } from '@/modules/auth/guards';
|
|
import { Roles } from '@/modules/auth/decorators';
|
|
import { RoleEnum } from '@/shared/constants';
|
|
|
|
@Controller('admin')
|
|
@UseGuards(JwtAuthGuard, RolesGuard)
|
|
export class AdminController {
|
|
@Get()
|
|
@Roles(RoleEnum.ADMIN, RoleEnum.SUPER_ADMIN)
|
|
adminOnly() {
|
|
return { message: 'Solo para administradores' };
|
|
}
|
|
}
|
|
```
|
|
|
|
### 3. Configurar el módulo
|
|
|
|
```typescript
|
|
// app.module.ts
|
|
import { AuthModule } from '@/modules/auth/auth.module';
|
|
|
|
@Module({
|
|
imports: [
|
|
AuthModule,
|
|
// ... otros módulos
|
|
],
|
|
})
|
|
export class AppModule {}
|
|
```
|
|
|
|
---
|
|
|
|
## Variables de Entorno Requeridas
|
|
|
|
```env
|
|
# JWT
|
|
JWT_SECRET=your-super-secret-key-change-in-production
|
|
JWT_EXPIRES_IN=15m
|
|
JWT_REFRESH_EXPIRES_IN=7d
|
|
|
|
# Base de datos (para TypeORM)
|
|
DB_HOST=localhost
|
|
DB_PORT=5432
|
|
DB_NAME=your_database
|
|
DB_USER=your_user
|
|
DB_PASSWORD=your_password
|
|
```
|
|
|
|
---
|
|
|
|
## Flujos de Autenticación
|
|
|
|
### Login Flow
|
|
|
|
```
|
|
1. Cliente envía email + password
|
|
2. AuthService valida credenciales
|
|
3. Si válidas:
|
|
- Genera access token (15min)
|
|
- Genera refresh token (7d)
|
|
- Crea sesión en BD
|
|
- Registra intento exitoso
|
|
4. Retorna tokens + user data
|
|
```
|
|
|
|
### Refresh Flow
|
|
|
|
```
|
|
1. Cliente envía refresh token
|
|
2. AuthService verifica token
|
|
3. Busca sesión en BD por hash del refresh token
|
|
4. Si válida y no expirada:
|
|
- Genera nuevos tokens
|
|
- Actualiza sesión
|
|
5. Retorna nuevos tokens
|
|
```
|
|
|
|
---
|
|
|
|
## Seguridad
|
|
|
|
- Passwords hasheados con bcrypt (cost 10)
|
|
- Refresh tokens hasheados en BD (SHA256)
|
|
- Tokens JWT con expiración corta
|
|
- Sesiones con metadata (IP, User-Agent, dispositivo)
|
|
- Logging de todos los intentos de auth
|
|
- Soft delete para usuarios (no eliminación física)
|
|
|
|
---
|
|
|
|
## Adaptaciones Necesarias
|
|
|
|
Al implementar en un nuevo proyecto, ajustar:
|
|
|
|
1. **Enum de roles**: Definir roles específicos del proyecto
|
|
2. **Schema de BD**: Puede ser diferente a `auth`/`auth_management`
|
|
3. **Campos de User entity**: Agregar/quitar según necesidades
|
|
4. **Conexión TypeORM**: Ajustar nombre de conexión si no es 'auth'
|
|
5. **Variables de entorno**: Configurar JWT_SECRET único
|
|
|
|
---
|
|
|
|
## Referencias
|
|
|
|
- [NestJS Authentication](https://docs.nestjs.com/security/authentication)
|
|
- [Passport.js](http://www.passportjs.org/)
|
|
- [JWT.io](https://jwt.io/)
|
|
|
|
---
|
|
|
|
**Mantenido por:** Sistema NEXUS
|
|
**Proyecto origen:** Gamilit Platform
|