ML Engine Updates: - Updated BTCUSD with Polygon API data (2024-2025): 215,699 new records - Re-trained all ML models: Attention (R²: 0.223), Base, Metamodel (87.3% confidence) - Backtest results: +176.71R profit with aggressive_filter strategy Documentation Consolidation: - Created docs/99-analisis/_MAP.md index with 13 new analysis documents - Consolidated inventories: removed duplicates from orchestration/inventarios/ - Updated ML_INVENTORY.yml with BTCUSD metrics and training results - Added execution reports: FASE11-BTCUSD, correction issues, alignment validation Architecture & Integration: - Updated all module documentation with NEXUS v3.4 frontmatter - Fixed _MAP.md indexes across all folders - Updated orchestration plans and traces Files: 229 changed, 5064 insertions(+), 1872 deletions(-) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
315 lines
18 KiB
Markdown
315 lines
18 KiB
Markdown
---
|
|
id: "US-AUTH-010"
|
|
title: "Configurar 2FA"
|
|
type: "User Story"
|
|
status: "Done"
|
|
priority: "Alta"
|
|
epic: "OQI-001"
|
|
story_points: 5
|
|
created_date: "2025-12-05"
|
|
updated_date: "2026-01-04"
|
|
---
|
|
|
|
# US-AUTH-010: Configurar 2FA
|
|
|
|
**Version:** 1.0.0
|
|
**Fecha:** 2025-12-05
|
|
**Estado:** ✅ Implementado
|
|
**Story Points:** 5
|
|
**Prioridad:** P1 (Alta)
|
|
**Épica:** [OQI-001](../_MAP.md)
|
|
|
|
---
|
|
|
|
## Historia de Usuario
|
|
|
|
**Como** usuario de Trading Platform
|
|
**Quiero** poder activar autenticación de dos factores
|
|
**Para** proteger mi cuenta con una capa adicional de seguridad
|
|
|
|
---
|
|
|
|
## Criterios de Aceptación
|
|
|
|
### AC-001: Acceso a configuración 2FA
|
|
|
|
**Dado** que estoy logueado en mi cuenta
|
|
**Cuando** voy a Configuración > Seguridad
|
|
**Entonces** debería ver una opción para "Activar autenticación de dos factores"
|
|
|
|
### AC-002: Generación de código QR
|
|
|
|
**Dado** que hago click en "Activar 2FA"
|
|
**Cuando** se inicia el proceso de configuración
|
|
**Entonces** debería ver:
|
|
- Un código QR para escanear
|
|
- El secreto manual como alternativa
|
|
- Instrucciones claras
|
|
|
|
### AC-003: Lista de apps compatibles
|
|
|
|
**Dado** que estoy configurando 2FA
|
|
**Cuando** veo las instrucciones
|
|
**Entonces** debería ver una lista de apps compatibles:
|
|
- Google Authenticator
|
|
- Microsoft Authenticator
|
|
- Authy
|
|
- 1Password
|
|
|
|
### AC-004: Verificación de código
|
|
|
|
**Dado** que escaneé el código QR con mi app
|
|
**Cuando** ingreso el código de 6 dígitos generado
|
|
**Entonces** debería verificarse correctamente si es válido
|
|
|
|
### AC-005: Código inválido
|
|
|
|
**Dado** que escaneé el código QR con mi app
|
|
**Cuando** ingreso un código incorrecto
|
|
**Entonces** debería ver "Código incorrecto, intenta de nuevo"
|
|
|
|
### AC-006: Generación de backup codes
|
|
|
|
**Dado** que verifico el código correctamente
|
|
**Cuando** se activa el 2FA
|
|
**Entonces** debería:
|
|
1. Ver 10 códigos de respaldo
|
|
2. Poder copiarlos al portapapeles
|
|
3. Poder descargarlos como archivo
|
|
4. Ver advertencia de guardarlos en lugar seguro
|
|
|
|
### AC-007: Confirmación de guardado
|
|
|
|
**Dado** que veo mis códigos de respaldo
|
|
**Cuando** no confirmo que los guardé
|
|
**Entonces** no debería poder continuar
|
|
|
|
### AC-008: 2FA activado exitosamente
|
|
|
|
**Dado** que confirmé guardar mis códigos
|
|
**Cuando** continúo
|
|
**Entonces** debería:
|
|
1. Ver "2FA activado exitosamente"
|
|
2. Recibir email de confirmación
|
|
3. Ver indicador de 2FA activo en mi perfil
|
|
|
|
### AC-009: Login con 2FA
|
|
|
|
**Dado** que tengo 2FA activado
|
|
**Cuando** hago login con email/password
|
|
**Entonces** debería:
|
|
1. Ver un segundo paso pidiendo código 2FA
|
|
2. Poder ingresar código de mi app
|
|
3. Tener opción de usar código de respaldo
|
|
|
|
### AC-010: Desactivar 2FA
|
|
|
|
**Dado** que tengo 2FA activado
|
|
**Cuando** intento desactivarlo
|
|
**Entonces** debería:
|
|
1. Ingresar un código 2FA válido
|
|
2. Confirmar la acción
|
|
3. Recibir email de notificación
|
|
|
|
---
|
|
|
|
## Flujo Visual
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────────────────┐
|
|
│ │
|
|
│ PASO 1: Configuración de seguridad │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ ⚙️ Configuración > Seguridad │ │
|
|
│ │ │ │
|
|
│ │ ┌──────────────────────────────────────────────────────────────┐│ │
|
|
│ │ │ ││ │
|
|
│ │ │ 🔐 Autenticación de dos factores ││ │
|
|
│ │ │ ││ │
|
|
│ │ │ Estado: ❌ Desactivado ││ │
|
|
│ │ │ ││ │
|
|
│ │ │ Agrega una capa extra de seguridad a tu cuenta. ││ │
|
|
│ │ │ Necesitarás tu teléfono para iniciar sesión. ││ │
|
|
│ │ │ ││ │
|
|
│ │ │ [Activar 2FA] ││ │
|
|
│ │ │ ││ │
|
|
│ │ └──────────────────────────────────────────────────────────────┘│ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ PASO 2: Escanear código QR │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ 📱 Configura tu aplicación de autenticación │ │
|
|
│ │ │ │
|
|
│ │ 1. Descarga una app de autenticación: │ │
|
|
│ │ • Google Authenticator │ │
|
|
│ │ • Microsoft Authenticator │ │
|
|
│ │ • Authy │ │
|
|
│ │ │ │
|
|
│ │ 2. Escanea este código QR: │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────┐ │ │
|
|
│ │ │ ▄▄▄▄▄ ▄▄▄▄▄ │ │ │
|
|
│ │ │ █ █ █ █ │ │ │
|
|
│ │ │ █████ █████ │ │ │
|
|
│ │ │ █ █ █ █ │ │ │
|
|
│ │ │ ▀▀▀▀▀ ▀▀▀▀▀ │ │ │
|
|
│ │ └─────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ ¿No puedes escanear? Ingresa este código manualmente: │ │
|
|
│ │ JBSWY3DPEHPK3PXP [Copiar] │ │
|
|
│ │ │ │
|
|
│ │ 3. Ingresa el código de 6 dígitos: │ │
|
|
│ │ ┌─────────────────────────────┐ │ │
|
|
│ │ │ _ _ _ _ _ _ │ │ │
|
|
│ │ └─────────────────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ [Cancelar] [Verificar y activar] │ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ PASO 3: Guardar códigos de respaldo │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ 🔑 Guarda tus códigos de respaldo │ │
|
|
│ │ │ │
|
|
│ │ ⚠️ IMPORTANTE: Guarda estos códigos en un lugar seguro. │ │
|
|
│ │ Si pierdes acceso a tu app de autenticación, estos códigos │ │
|
|
│ │ son la única forma de acceder a tu cuenta. │ │
|
|
│ │ │ │
|
|
│ │ ┌──────────────────────────────────────────────────────────────┐│ │
|
|
│ │ │ ││ │
|
|
│ │ │ A1B2C3D4 E5F6G7H8 I9J0K1L2 M3N4O5P6 ││ │
|
|
│ │ │ Q7R8S9T0 U1V2W3X4 Y5Z6A7B8 C9D0E1F2 ││ │
|
|
│ │ │ G3H4I5J6 K7L8M9N0 ││ │
|
|
│ │ │ ││ │
|
|
│ │ └──────────────────────────────────────────────────────────────┘│ │
|
|
│ │ │ │
|
|
│ │ [📋 Copiar códigos] [⬇️ Descargar como archivo] │ │
|
|
│ │ │ │
|
|
│ │ ☐ He guardado mis códigos de respaldo en un lugar seguro │ │
|
|
│ │ │ │
|
|
│ │ [Continuar] │ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ PASO 4: Confirmación │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ ✅ 2FA activado exitosamente │ │
|
|
│ │ │ │
|
|
│ │ Tu cuenta ahora está protegida con autenticación de dos │ │
|
|
│ │ factores. Necesitarás tu app de autenticación cada vez que │ │
|
|
│ │ inicies sesión. │ │
|
|
│ │ │ │
|
|
│ │ [Volver a configuración] │ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Login con 2FA
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────────────────┐
|
|
│ │
|
|
│ PASO 1: Login normal │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ Email: usuario@example.com │ │
|
|
│ │ Password: •••••••• │ │
|
|
│ │ │ │
|
|
│ │ [Iniciar sesión] │ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ PASO 2: Verificación 2FA │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ │ │
|
|
│ │ 🔐 Verificación de dos factores │ │
|
|
│ │ │ │
|
|
│ │ Ingresa el código de 6 dígitos de tu app de autenticación: │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────────────────┐ │ │
|
|
│ │ │ _ _ _ _ _ _ │ │ │
|
|
│ │ └─────────────────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ [Verificar] │ │
|
|
│ │ │ │
|
|
│ │ ¿Problemas para acceder? Usa un código de respaldo │ │
|
|
│ │ │ │
|
|
│ └────────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Notas Técnicas
|
|
|
|
### Librería TOTP
|
|
|
|
```typescript
|
|
import speakeasy from 'speakeasy';
|
|
|
|
// Generar secreto
|
|
const secret = speakeasy.generateSecret({
|
|
length: 20,
|
|
name: `Trading Platform:${user.email}`,
|
|
issuer: 'Trading Platform',
|
|
});
|
|
|
|
// Verificar código
|
|
const verified = speakeasy.totp.verify({
|
|
secret: user.twoFactorSecret,
|
|
encoding: 'base32',
|
|
token: code,
|
|
window: 1, // ±30 segundos
|
|
});
|
|
```
|
|
|
|
### Almacenamiento Seguro
|
|
|
|
- Secreto TOTP encriptado con AES-256-GCM
|
|
- Backup codes hasheados con bcrypt
|
|
- Nunca loguear secretos
|
|
|
|
### Frontend
|
|
|
|
- Componente: `apps/frontend/src/modules/settings/pages/Security.tsx`
|
|
- QR generado con `qrcode` npm package
|
|
|
|
### Backend
|
|
|
|
- Service: `apps/backend/src/modules/auth/services/twofa.service.ts`
|
|
- Endpoints:
|
|
- `POST /auth/2fa/setup`
|
|
- `POST /auth/2fa/enable`
|
|
- `POST /auth/2fa/verify`
|
|
- `POST /auth/2fa/disable`
|
|
|
|
---
|
|
|
|
## Requerimientos Relacionados
|
|
|
|
- [RF-AUTH-004: Two-Factor Authentication](../requerimientos/RF-AUTH-004-2fa.md)
|
|
|
|
## Especificaciones Relacionadas
|
|
|
|
- [ET-AUTH-005: Security](../especificaciones/ET-AUTH-005-security.md)
|