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>
306 lines
11 KiB
Markdown
306 lines
11 KiB
Markdown
---
|
|
id: "US-AUTH-004"
|
|
title: "OAuth Facebook"
|
|
type: "User Story"
|
|
status: "To Do"
|
|
priority: "Alta"
|
|
epic: "OQI-001"
|
|
story_points: 3
|
|
created_date: "2025-12-05"
|
|
updated_date: "2026-01-04"
|
|
---
|
|
|
|
# US-AUTH-004: OAuth Facebook
|
|
|
|
**Version:** 1.0.0
|
|
**Fecha:** 2025-12-05
|
|
**Estado:** Pendiente
|
|
**Story Points:** 3
|
|
**Prioridad:** P1 (Alta)
|
|
**Épica:** [OQI-001](../_MAP.md)
|
|
|
|
---
|
|
|
|
## Historia de Usuario
|
|
|
|
**Como** visitante o usuario de Trading Platform
|
|
**Quiero** poder registrarme e iniciar sesión usando mi cuenta de Facebook
|
|
**Para** tener un acceso rápido y sencillo sin crear una nueva contraseña
|
|
|
|
---
|
|
|
|
## Criterios de Aceptación
|
|
|
|
### AC-001: Botón de Facebook visible
|
|
|
|
**Dado** que estoy en la página de registro o login
|
|
**Cuando** veo las opciones de autenticación
|
|
**Entonces** debería ver un botón "Continuar con Facebook"
|
|
**Y** debería tener el color y logo oficial de Facebook
|
|
|
|
### AC-002: Flujo de OAuth
|
|
|
|
**Dado** que hago click en "Continuar con Facebook"
|
|
**Cuando** se abre la ventana de Facebook
|
|
**Entonces** debería:
|
|
1. Ver la pantalla de autorización de Facebook
|
|
2. Poder revisar los permisos solicitados
|
|
3. Poder autorizar o cancelar
|
|
|
|
### AC-003: Permisos solicitados
|
|
|
|
**Dado** que estoy en la pantalla de autorización de Facebook
|
|
**Cuando** reviso los permisos
|
|
**Entonces** la app debería solicitar únicamente:
|
|
- Email
|
|
- Nombre público
|
|
- Foto de perfil
|
|
|
|
### AC-004: Primer registro exitoso
|
|
|
|
**Dado** que es mi primera vez usando Facebook OAuth
|
|
**Cuando** autorizo los permisos
|
|
**Entonces** debería:
|
|
1. Crear mi cuenta automáticamente
|
|
2. Recibir un JWT token
|
|
3. Ser redirigido al dashboard
|
|
4. Ver mi nombre y foto de Facebook
|
|
5. NO necesitar verificación de email
|
|
|
|
### AC-005: Login existente
|
|
|
|
**Dado** que ya tengo una cuenta vinculada con Facebook
|
|
**Cuando** uso "Continuar con Facebook"
|
|
**Entonces** debería:
|
|
1. Iniciar sesión automáticamente
|
|
2. Ser redirigido al dashboard
|
|
3. NO ver pantalla de registro
|
|
|
|
### AC-006: Email ya registrado con otro método
|
|
|
|
**Dado** que mi email de Facebook ya está registrado con email/password
|
|
**Cuando** intento usar Facebook OAuth
|
|
**Entonces** debería ver un mensaje:
|
|
- "Este email ya está registrado. ¿Deseas vincular tu cuenta de Facebook?"
|
|
**Y** debería poder vincular las cuentas
|
|
|
|
### AC-007: Cancelación del flujo
|
|
|
|
**Dado** que inicio el flujo de Facebook OAuth
|
|
**Cuando** cancelo en la ventana de Facebook
|
|
**Entonces** debería:
|
|
1. Volver a la página de login/registro
|
|
2. Ver un mensaje "Autenticación cancelada"
|
|
3. Poder intentar con otro método
|
|
|
|
### AC-008: Error de Facebook
|
|
|
|
**Dado** que hay un error en el servicio de Facebook
|
|
**Cuando** intento autenticarme
|
|
**Entonces** debería ver un mensaje:
|
|
- "Error al conectar con Facebook. Intenta más tarde"
|
|
**Y** debería poder usar otro método de autenticación
|
|
|
|
---
|
|
|
|
## Mockup
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ │
|
|
│ 🌟 Bienvenido a Trading Platform │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ 📧 Email │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ 🔵 Continuar con Facebook │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ 🔴 Continuar con Google │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ [Twitter/X] [Apple] [GitHub] │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
|
Ventana de Facebook OAuth:
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ facebook.com ✕ │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ Trading Platform desea acceder a: │
|
|
│ │
|
|
│ ✓ Tu nombre y foto de perfil │
|
|
│ ✓ Tu dirección de email │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ Continuar como Juan Pérez │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ Cancelar │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Tareas Técnicas
|
|
|
|
### Database (DB)
|
|
|
|
- [ ] Agregar campos a tabla `users`:
|
|
```sql
|
|
ALTER TABLE users ADD COLUMN facebook_id VARCHAR(255) UNIQUE;
|
|
ALTER TABLE users ADD COLUMN avatar_url TEXT;
|
|
```
|
|
- [ ] Tabla `oauth_connections`:
|
|
```sql
|
|
CREATE TABLE oauth_connections (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID REFERENCES users(id),
|
|
provider VARCHAR(50), -- 'facebook', 'google', etc
|
|
provider_user_id VARCHAR(255),
|
|
access_token TEXT,
|
|
refresh_token TEXT,
|
|
token_expires_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW(),
|
|
UNIQUE(provider, provider_user_id)
|
|
);
|
|
```
|
|
|
|
### Backend (BE)
|
|
|
|
- [ ] Configurar Facebook App en Meta Developers
|
|
- [ ] Obtener App ID y App Secret
|
|
- [ ] Endpoint `GET /api/v1/auth/facebook`
|
|
- Redirige a Facebook OAuth
|
|
- [ ] Endpoint `GET /api/v1/auth/facebook/callback`
|
|
- Recibe código de autorización
|
|
- Intercambia por access token
|
|
- Obtiene datos del usuario
|
|
- Crea o actualiza usuario
|
|
- Genera JWT token
|
|
- [ ] Service `FacebookOAuthService`
|
|
- `getAuthorizationUrl()`
|
|
- `exchangeCodeForToken()`
|
|
- `getUserProfile()`
|
|
- `linkAccount()`
|
|
- [ ] Manejo de refresh tokens
|
|
- [ ] Tests unitarios (8 casos)
|
|
- [ ] Tests de integración con mock de Facebook API
|
|
|
|
### Frontend (FE)
|
|
|
|
- [ ] Botón "Continuar con Facebook"
|
|
- [ ] Manejo de popup o redirect de OAuth
|
|
- [ ] Recepción de callback
|
|
- [ ] Almacenamiento de token JWT
|
|
- [ ] Estado de loading durante OAuth
|
|
- [ ] Manejo de errores
|
|
- [ ] Modal de vinculación de cuentas
|
|
- [ ] Tests con React Testing Library
|
|
|
|
### Testing (QA)
|
|
|
|
- [ ] E2E: Registro nuevo con Facebook
|
|
- [ ] E2E: Login existente con Facebook
|
|
- [ ] E2E: Vinculación de cuentas
|
|
- [ ] E2E: Cancelación del flujo
|
|
- [ ] E2E: Permisos rechazados
|
|
- [ ] Test de seguridad: Validación de tokens
|
|
- [ ] Test de seguridad: CSRF protection
|
|
- [ ] Mock de Facebook API para tests
|
|
|
|
---
|
|
|
|
## Dependencias
|
|
|
|
- **Bloqueantes:**
|
|
- Cuenta de Facebook Developer
|
|
- Configuración de dominio verificado
|
|
- SSL/HTTPS en producción
|
|
|
|
- **Deseables:**
|
|
- US-AUTH-003: Para mantener consistencia con Google OAuth
|
|
|
|
---
|
|
|
|
## Definition of Ready (DoR)
|
|
|
|
- [ ] Facebook App creada y configurada
|
|
- [ ] Credenciales de desarrollo disponibles
|
|
- [ ] Mockups aprobados
|
|
- [ ] API contract definido
|
|
- [ ] Política de privacidad publicada (requerido por Facebook)
|
|
|
|
---
|
|
|
|
## Definition of Done (DoD)
|
|
|
|
- [ ] Código implementado y revisado
|
|
- [ ] Tests unitarios con 80%+ cobertura
|
|
- [ ] Tests de integración pasando
|
|
- [ ] Tests E2E implementados
|
|
- [ ] Facebook App Review aprobado (para producción)
|
|
- [ ] Documentación actualizada
|
|
- [ ] Manejo de errores completo
|
|
- [ ] Logs implementados
|
|
- [ ] QA aprobado en staging
|
|
- [ ] Deploy a producción exitoso
|
|
|
|
---
|
|
|
|
## Notas Técnicas
|
|
|
|
### Facebook OAuth Flow
|
|
|
|
1. Frontend redirige a `/api/v1/auth/facebook`
|
|
2. Backend redirige a Facebook con:
|
|
- `client_id`
|
|
- `redirect_uri`
|
|
- `scope=email,public_profile`
|
|
- `state` (CSRF token)
|
|
3. Usuario autoriza en Facebook
|
|
4. Facebook redirige a `redirect_uri` con `code`
|
|
5. Backend intercambia `code` por `access_token`
|
|
6. Backend obtiene perfil del usuario
|
|
7. Backend crea/actualiza usuario
|
|
8. Backend genera JWT y redirige a frontend
|
|
|
|
### Facebook API Endpoints
|
|
|
|
- Authorization: `https://www.facebook.com/v18.0/dialog/oauth`
|
|
- Token exchange: `https://graph.facebook.com/v18.0/oauth/access_token`
|
|
- User info: `https://graph.facebook.com/v18.0/me?fields=id,name,email,picture`
|
|
|
|
### Environment Variables
|
|
|
|
```env
|
|
FACEBOOK_APP_ID=your_app_id
|
|
FACEBOOK_APP_SECRET=your_app_secret
|
|
FACEBOOK_CALLBACK_URL=https://trading.com/api/v1/auth/facebook/callback
|
|
```
|
|
|
|
### Security Considerations
|
|
|
|
- Validar `state` parameter para prevenir CSRF
|
|
- No almacenar access tokens en localStorage
|
|
- Usar refresh tokens cuando sea posible
|
|
- Validar que el email viene de Facebook
|
|
- Rate limiting en endpoints de OAuth
|
|
|
|
---
|
|
|
|
## Requerimientos Relacionados
|
|
|
|
- [RF-AUTH-003: OAuth Social](../requerimientos/RF-AUTH-003-oauth.md)
|
|
|
|
## Especificaciones Relacionadas
|
|
|
|
- [ET-AUTH-002: JWT Tokens](../especificaciones/ET-AUTH-002-jwt.md)
|
|
- [ET-AUTH-004: OAuth Integration](../especificaciones/ET-AUTH-004-oauth.md)
|