Social Identity & Auth Service
Microservicio robusto de autenticación, perfiles y motor de interacciones sociales.
Auth Service es una solución integral de gestión de identidades diseñada para arquitecturas de microservicios. Construido con Fastify y TypeScript, el servicio no solo maneja el ciclo de vida de autenticación mediante JWT (Access & Refresh Tokens), sino que también implementa un motor de interacciones sociales que incluye sistemas de amistad y bloqueos. Soporta OAuth2 con Google y GitHub, invalidación de sesiones por versión de token, comunicación segura inter-servicios y rate limiting granular por endpoint. Está diseñado con un enfoque prioritario en la seguridad, utilizando cookies httpOnly, métricas de Prometheus y logging estructurado con Pino.
Capturas de pantalla próximamente
1. Arquitectura
Routes (HTTP Layer)
Capa HTTP encargada del parseo de requests, validación de esquemas, formato de respuestas y aplicación de guards. Delega toda la lógica de negocio a los servicios.
Services (Business Logic)
Capa de lógica de negocio con clases estáticas. Maneja reglas de dominio, gestión de transacciones y coordinación entre módulos (AuthService, FriendshipService, BlockService, OAuthService).
Database (Data Access)
Capa de acceso a datos con Prisma usando el adapter pattern (@prisma/adapter-pg) con un pool de conexiones pg nativo. Incluye DTOs para transformación de respuestas.
2. Características
Seguridad y Autenticación
Autenticación JWT de Doble Token
Access Tokens de corta duración (15 min) y Refresh Tokens (14 días) almacenados en cookies httpOnly con rotación y revocación en base de datos. El payload incluye versión de token para invalidación instantánea.
OAuth2 Social Login
Integración completa con Google (OpenID Connect) y GitHub OAuth2. Manejo de CSRF con state en memoria, extracción automática de datos de perfil y detección de conflictos de email entre proveedores.
Invalidación por Token Version
Mecanismo de invalidación sin almacenamiento: cada usuario tiene un tokenVersion en su JWT. Al hacer logout, se incrementa la versión, invalidando instantáneamente todos los tokens existentes sin necesidad de blacklist.
Rate Limiting Granular
Protección contra fuerza bruta y abuso con límites configurados por endpoint: Login (10/15min), Registro (10/15min), Refresh (30/15min), y más.
Comunicación Segura Inter-Servicios
Middleware especializado para autenticación de microservicios internos mediante API Keys segregadas. Permite que servicios como TicketPlatform consulten usuarios sin exponer endpoints públicos.
Motor Social
Motor de Interacciones Sociales
Sistema completo de interacciones entre usuarios con auto-aceptación de amistades cuando ambas partes envían solicitudes, y bloqueos que eliminan automáticamente amistades existentes.
Sistema de Amistades
Ciclo completo: enviar, aceptar, rechazar, cancelar solicitudes. Pares normalizados (user1Id siempre menor) para evitar duplicados. Solicitud rechazada puede reenviarse reutilizando el registro.
Sistema de Bloqueos
Bloqueo idempotente que en transacción elimina cualquier amistad existente y crea el bloqueo. Bloqueos previenen todas las interacciones de amistad (enviar, aceptar, rechazar).
Gestión de Perfiles de Usuario
Perfiles con creación automática on-demand (lazy). Campos: displayName, firstName, lastName, avatarUrl, bio. Perfil público excluye email; perfil privado incluye email y rol.
Infraestructura y Producción
Métricas Prometheus
Endpoint /health/metrics con métricas personalizadas: http_requests_total (Counter), http_request_duration_seconds (Histogram), http_requests_in_progress (Gauge), más métricas por defecto de Node.js.
Logging Estructurado con Pino
Registro estructurado de todos los requests con método, path y datos contextuales. Headers sensibles (authorization, cookie) automáticamente redactados.
Documentación Swagger
API documentada con @fastify/swagger y @fastify/swagger-ui. Disponible solo en entorno no productivo para reducir superficie de ataque. Schema completo de todos los endpoints.
Preparado para Producción
Docker multi-stage con Node.js Alpine, validación estricta de variables de entorno al boot, 75+ tests con Vitest y coverage, CORS configurable y Docker Compose listo.
3. Tech Stack
4. Referencia API
| Módulo | Endpoints |
|---|---|
| Autenticación | 5 |
| OAuth2 | 4 |
| Perfiles | 3 |
| Amistades | 8 |
| Bloqueos | 3 |
| Interno | 1 |
| Health | 2 |
5. Decisiones de Diseño
Token Version vs Blacklist
En lugar de mantener una blacklist de tokens revocados (requiere almacenamiento y consulta en cada request), se embebe un tokenVersion en el JWT. Al hacer logout, incrementar la versión invalida todos los tokens existentes instantáneamente sin almacenamiento adicional.
publicId como Identificador Externo
Los usuarios tienen un id entero auto-incremental (interno, usado en FKs) y un UUID publicId (externo, usado en respuestas API y JWT). Esto previene ataques de enumeración de IDs y desacopla el almacenamiento interno del contrato de API.
Pares Normalizados de Amistad
normalizePair() asegura que user1Id siempre sea el ID menor. Esto previene duplicados (A→B y B→A) aprovechando el constraint único [user1Id, user2Id] sin necesidad de consultas adicionales.
Estrategia de Tokens Separados
Access token en el body de la respuesta (para localStorage y header Authorization), refresh token en cookie httpOnly (XSS protection, envío automático). Funciona across subdomains con dominio de cookie configurable.