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>
13 KiB
| id | title | type | status | priority | epic | story_points | created_date | updated_date |
|---|---|---|---|---|---|---|---|---|
| US-AUTH-006 | OAuth Apple Sign In | User Story | To Do | Alta | OQI-001 | 3 | 2025-12-05 | 2026-01-04 |
US-AUTH-006: OAuth Apple Sign In
Version: 1.0.0 Fecha: 2025-12-05 Estado: Pendiente Story Points: 3 Prioridad: P1 (Alta) Épica: OQI-001
Historia de Usuario
Como visitante o usuario de Trading Platform Quiero poder registrarme e iniciar sesión usando Apple Sign In Para tener un acceso seguro y privado sin compartir mi email real
Criterios de Aceptación
AC-001: Botón de Apple 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 Apple" Y debería seguir las guías de diseño de Apple (botón negro con logo)
AC-002: Flujo de OAuth
Dado que hago click en "Continuar con Apple" Cuando se abre la ventana de Apple Entonces debería:
- Ver la pantalla de autorización de Apple
- Poder elegir compartir mi email real o ocultarlo
- Poder usar Touch ID / Face ID si está disponible
- Poder autorizar con mi Apple ID
AC-003: Opción de ocultar email
Dado que estoy en la pantalla de Apple Sign In Cuando elijo ocultar mi email Entonces Apple debería generar un email relay privado Y ese email debería funcionar para comunicaciones
AC-004: Primer registro exitoso
Dado que es mi primera vez usando Apple Sign In Cuando autorizo los permisos Entonces debería:
- Crear mi cuenta automáticamente
- Recibir un JWT token
- Ser redirigido al dashboard
- Ver mi nombre de Apple (si lo compartí)
- Email verificado automáticamente
AC-005: Login existente
Dado que ya tengo una cuenta vinculada con Apple Cuando uso "Continuar con Apple" Entonces debería:
- Iniciar sesión automáticamente
- Usar Touch ID / Face ID si está configurado
- Ser redirigido al dashboard
AC-006: Email relay de Apple
Dado que usé la opción de ocultar mi email Cuando la aplicación envía emails Entonces debería enviarlos al email relay de Apple Y Apple debería reenviarlos a mi email real Y debería poder responder a través del relay
AC-007: Datos mínimos recibidos
Dado que autorizo Apple Sign In Cuando completo el flujo Entonces la app debería recibir:
user_idúnico de Apple- Email (real o relay)
- Nombre (opcional, solo primera vez) Y NO debería recibir otra información personal
AC-008: Revocación de acceso
Dado que revoco el acceso desde configuración de Apple Cuando intento hacer login nuevamente Entonces debería ver un error de autorización Y debería poder re-autorizar la aplicación
Mockup
┌─────────────────────────────────────────────────────────────┐
│ │
│ 🌟 Bienvenido a Trading Platform │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📧 Email │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🔴 Continuar con Google │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Continuar con Apple │ │
│ └─────────────────────────────────────────────────────┘ │
│ (Botón negro con logo de Apple blanco) │
│ │
│ [Facebook] [Twitter/X] [GitHub] │
│ │
└─────────────────────────────────────────────────────────────┘
Ventana de Apple Sign In:
┌─────────────────────────────────────────────────────────────┐
│ appleid.apple.com ✕ │
├─────────────────────────────────────────────────────────────┤
│ │
│ │
│ │
│ "Trading Platform" desea usar tu Apple ID para iniciar sesión │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Nombre │ │
│ │ ○ Compartir mi nombre │ │
│ │ ○ No compartir │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Email │ │
│ │ ○ Compartir mi email (juan@icloud.com) │ │
│ │ ● Ocultar mi email │ │
│ │ (se usará: xyz123@privaterelay.appleid.com) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Tu información será compartida según las políticas de │
│ privacidad de Trading Platform. │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Continuar con Touch ID │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Cancelar │
│ │
└─────────────────────────────────────────────────────────────┘
Tareas Técnicas
Database (DB)
- Agregar campos a tabla
users:ALTER TABLE users ADD COLUMN apple_id VARCHAR(255) UNIQUE; ALTER TABLE users ADD COLUMN is_private_email BOOLEAN DEFAULT false; - Usar tabla
oauth_connectionsexistente - Índice en
apple_id
Backend (BE)
- Configurar Apple Developer Account
- Crear App ID y Service ID
- Generar y configurar private key (.p8)
- Endpoint
GET /api/v1/auth/apple- Redirige a Apple Sign In
- Endpoint
POST /api/v1/auth/apple/callback- Recibe ID Token (JWT)
- Valida firma del token con Apple public key
- Decodifica user info
- Maneja primera autorización (recibe nombre)
- Crea o actualiza usuario
- Genera JWT token
- Service
AppleOAuthServicegetAuthorizationUrl()validateIdToken()decodeUserInfo()linkAccount()
- Librería:
apple-signin-autho similar - Tests unitarios (8 casos)
- Tests de integración con mock
Frontend (FE)
- Botón "Sign in with Apple" (siguiendo guías de Apple)
- Manejo de popup/redirect OAuth
- Recepción de callback
- Almacenamiento de token JWT
- Estado de loading
- Manejo de errores
- Tests con React Testing Library
Testing (QA)
- E2E: Registro con Apple (email real)
- E2E: Registro con Apple (email oculto)
- E2E: Login existente
- E2E: Revocación y re-autorización
- Test de validación de ID Token
- Test de seguridad: Firma del token
- Test de seguridad: CSRF protection
- Mock de Apple ID Token
Dependencias
-
Bloqueantes:
- Apple Developer Account ($99/año)
- Dominio verificado en Apple
- Configuración de Service ID
- Private key (.p8) generada
- SSL/HTTPS en producción
-
Deseables:
- US-AUTH-003: Consistencia con otros OAuth
Definition of Ready (DoR)
- Apple Developer Account activa
- Service ID configurado
- Private key generada y segura
- Mockups aprobados siguiendo Apple HIG
- API contract definido
- Dominio verificado en Apple
Definition of Done (DoD)
- Código implementado y revisado
- Tests unitarios con 80%+ cobertura
- Tests de integración pasando
- Tests E2E implementados
- Botón cumple con Apple guidelines
- Validación de ID Token implementada
- Manejo de email relay funcional
- Documentación actualizada
- Logs implementados
- QA aprobado en staging
- Deploy a producción exitoso
Notas Técnicas
Apple Sign In Flow
- Frontend redirige a
/api/v1/auth/apple - Backend redirige a Apple con:
client_id(Service ID)redirect_uriresponse_type=code id_tokenresponse_mode=form_postscope=name emailstate(CSRF token)
- Usuario autoriza en Apple
- Apple envía POST a
redirect_uricon:id_token(JWT firmado)code(authorization code)user(solo primera vez, contiene nombre)
- Backend valida ID Token con Apple public key
- Backend decodifica user info
- Backend crea/actualiza usuario
- Backend genera JWT y redirige a frontend
Apple ID Token Structure
{
"iss": "https://appleid.apple.com",
"aud": "com.trading.service",
"exp": 1234567890,
"iat": 1234567890,
"sub": "001234.abc123...", // Apple User ID
"email": "xyz@privaterelay.appleid.com",
"email_verified": true,
"is_private_email": true,
"nonce_supported": true
}
Environment Variables
APPLE_SERVICE_ID=com.trading.service
APPLE_TEAM_ID=ABC123XYZ
APPLE_KEY_ID=KEY123
APPLE_PRIVATE_KEY_PATH=/path/to/AuthKey_KEY123.p8
APPLE_CALLBACK_URL=https://trading.com/api/v1/auth/apple/callback
Consideraciones Especiales de Apple
- Apple solo envía nombre en la primera autorización
- Email relay de Apple es permanente por app
- ID Token está firmado con RS256
- Requiere validar firma con Apple public keys
- Response mode debe ser
form_post(no query params) - Requiere HTTPS estricto
- No hay refresh tokens en el flujo web
Security Considerations
- Validar firma del ID Token con Apple public key
- Verificar
audclaim coincide con Service ID - Validar
isseshttps://appleid.apple.com - Verificar
expno está expirado - Validar
stateparameter (CSRF) - Guardar nombre solo en primera autorización
- Logs de autenticación
Apple Design Guidelines
- Usar botón oficial "Sign in with Apple"
- Color negro en tema claro, blanco en tema oscuro
- Logo de Apple siempre visible
- Texto específico según contexto
- Mismo tamaño que otros botones OAuth