# 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
