# AUTH - REFERENCE IMPLEMENTATION

**Versión:** 1.0.0 | **Fecha:** 2025-12-12 | **Nivel:** Catalog (3)

---

## ÍNDICE DE ARCHIVOS

| Archivo | Descripción | LOC | Patrón Principal |
|---------|-------------|-----|------------------|
| `auth.service.reference.ts` | Servicio completo de autenticación JWT | 230 | Register, Login, Refresh, Logout |
| `jwt-auth.guard.reference.ts` | Guard para proteger rutas con JWT | ~60 | Passport JWT Guard |
| `jwt.strategy.reference.ts` | Estrategia Passport para validación JWT | ~70 | Passport Strategy |
| `roles.guard.reference.ts` | Guard para control de acceso basado en roles | ~65 | RBAC (Role-Based Access Control) |

---

## CÓMO USAR

### Flujo de adopción recomendado

```yaml
PASO_1: Identificar necesidades
  - ¿Necesitas autenticación completa? → auth.service.reference.ts
  - ¿Solo proteger rutas? → jwt-auth.guard.reference.ts
  - ¿Control por roles? → roles.guard.reference.ts + jwt.strategy.reference.ts

PASO_2: Copiar archivos base
  - Copiar archivos necesarios a tu módulo de auth
  - Renombrar eliminando ".reference"

PASO_3: Adaptar imports
  - Ajustar rutas de entidades (User, Profile, UserSession)
  - Ajustar DTOs según tu esquema
  - Configurar conexión a BD correcta (@InjectRepository)

PASO_4: Configurar variables de entorno
  - JWT_SECRET
  - JWT_EXPIRES_IN (default: 15m)
  - REFRESH_TOKEN_EXPIRES (default: 7d)
  - BCRYPT_COST (default: 10)

PASO_5: Implementar entidades requeridas
  - User: id, email, encrypted_password, role
  - Profile: id, user_id, email, ...
  - UserSession: id, user_id, refresh_token, expires_at, is_revoked

PASO_6: Validar integración
  - npm run build
  - npm run lint
  - Pruebas de endpoints: /auth/register, /auth/login, /auth/refresh
```

---

## PATRONES IMPLEMENTADOS

### 1. Autenticación JWT (auth.service.reference.ts)

**Características:**
- Registro con email único
- Password hasheado con bcrypt (cost 10)
- Access token (15m) + Refresh token (7d)
- Gestión de sesiones con revocación
- Refresh token hasheado (SHA-256) en BD

**Endpoints típicos:**
```typescript
POST /auth/register   → { accessToken, refreshToken, user }
POST /auth/login      → { accessToken, refreshToken, user }
POST /auth/refresh    → { accessToken, refreshToken, user }
POST /auth/logout     → { message: 'Logout successful' }
```

### 2. Guards de protección

**jwt-auth.guard.reference.ts:**
```typescript
// Uso en controladores
@UseGuards(JwtAuthGuard)
@Get('profile')
getProfile(@Request() req) {
  return req.user; // Usuario del token JWT
}
```

**roles.guard.reference.ts:**
```typescript
// Control de acceso por roles
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin', 'moderator')
@Delete('users/:id')
deleteUser(@Param('id') id: string) {
  // Solo admin y moderator pueden ejecutar
}
```

### 3. Estrategia JWT (jwt.strategy.reference.ts)

**Funcionalidad:**
- Valida tokens en cada request
- Extrae payload del token
- Inyecta `req.user` con datos del usuario

---

## NOTAS DE ADAPTACIÓN

### Variables a reemplazar

```typescript
// EN auth.service.reference.ts
User              → Tu entidad de usuario
Profile           → Tu entidad de perfil (opcional)
UserSession       → Tu entidad de sesiones
RegisterUserDto   → Tu DTO de registro

// EN jwt.strategy.reference.ts
JWT_SECRET        → process.env.JWT_SECRET
userRepository    → Tu repositorio/servicio de usuarios

// EN roles.guard.reference.ts
@Roles()          → Tu decorador custom (crear si no existe)
```

### Dependencias requeridas

```bash
npm install --save @nestjs/jwt @nestjs/passport passport passport-jwt bcrypt
npm install --save-dev @types/passport-jwt @types/bcrypt
```

### Esquema de base de datos

```sql
-- Tabla users (adaptar según tu schema)
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email VARCHAR(255) UNIQUE NOT NULL,
  encrypted_password VARCHAR(255) NOT NULL,
  role VARCHAR(50) DEFAULT 'user',
  created_at TIMESTAMP DEFAULT NOW()
);

-- Tabla user_sessions
CREATE TABLE user_sessions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  refresh_token VARCHAR(64) NOT NULL, -- SHA-256 hash (64 chars)
  expires_at TIMESTAMP NOT NULL,
  is_revoked BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_user_sessions_refresh_token ON user_sessions(refresh_token);
```

---

## CASOS DE USO COMUNES

### 1. Integrar autenticación en proyecto nuevo

```typescript
// 1. Copiar auth.service.reference.ts → auth.service.ts
// 2. Copiar guards y strategy
// 3. Configurar en auth.module.ts:

@Module({
  imports: [
    TypeOrmModule.forFeature([User, Profile, UserSession], 'auth'),
    JwtModule.register({
      secret: process.env.JWT_SECRET,
      signOptions: { expiresIn: '15m' },
    }),
    PassportModule,
  ],
  providers: [AuthService, JwtStrategy, RolesGuard],
  controllers: [AuthController],
  exports: [AuthService],
})
export class AuthModule {}
```

### 2. Migrar de autenticación básica a JWT

```typescript
// Antes: session-based
@UseGuards(SessionGuard)

// Después: JWT-based
@UseGuards(JwtAuthGuard)
```

### 3. Agregar roles a usuarios existentes

```typescript
// 1. Migrar BD: ALTER TABLE users ADD COLUMN role VARCHAR(50) DEFAULT 'user';
// 2. Implementar RolesGuard (roles.guard.reference.ts)
// 3. Usar decorador @Roles() en rutas protegidas
```

---

## CHECKLIST DE VALIDACIÓN

Antes de marcar como completo:

- [ ] Build pasa: `npm run build`
- [ ] Lint pasa: `npm run lint`
- [ ] Registro funciona: POST /auth/register
- [ ] Login funciona: POST /auth/login
- [ ] Refresh funciona: POST /auth/refresh
- [ ] Guards protegen rutas correctamente
- [ ] Tokens expiran según configuración
- [ ] Logout revoca sesión en BD
- [ ] Roles bloquean acceso no autorizado

---

## REFERENCIAS CRUZADAS

### Dependencias en @CATALOG

- **session-management**: Para gestión avanzada de sesiones multi-dispositivo
- **multi-tenancy**: Si necesitas autenticación por tenant
- **rate-limiting**: Proteger endpoints de auth contra brute-force

### Relacionado con SIMCO

- **@OP_BACKEND**: Operaciones de backend (crear service, guards)
- **@SIMCO-REUTILIZAR**: Este catálogo es candidato para reutilización
- **@SIMCO-VALIDAR**: Validar implementación antes de deploy

### Documentación adicional

- NestJS Auth: https://docs.nestjs.com/security/authentication
- Passport JWT: http://www.passportjs.org/packages/passport-jwt/
- bcrypt: https://github.com/kelektiv/node.bcrypt.js

---

**Mantenido por:** Core Team | **Origen:** gamilit/apps/backend/src/modules/auth/
