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