--- 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)