Skip to content

Metadata

Owner: sso-team · Lifecycle: active · Last Reviewed: 2026-02-13 · Support: #sso-core

SSO Core — Arquitectura

Diagrama General


Componentes Principales

Capas de la Aplicación

Routes (src/routes/)

Definen los endpoints HTTP, validan entrada con Joi y delegan al service layer:

ArchivoPrefijoEndpoints
auth.ts/authsignup, signin, logout, authorize, token, verify-session
user.ts/userprofile, tenants
tenant.ts/tenantCRUD, members, apps
role.ts/roleCRUD, permissions
applications.ts/applicationsCRUD, tenant apps, user access
appResource.ts/app-resourcesregister, list, tenant-available
otp.ts/otpgenerate, verify, validate, backup-code
emailVerification.ts/email-verificationsend, verify
session.ts/sessionverify, refresh, revoke

Services (src/services/)

Lógica de negocio: autenticación, gestión de sesiones, JWT, OTP, email.

Repositories (src/repositories/)

Acceso a datos a través de Prisma Client. Un repositorio por modelo de base de datos.

Middleware (src/middleware/)

MiddlewareDescripción
auth.tsVerifica Bearer token (legacy)
ssoAuth.tsVerifica cookie sso_session
ssoSystemAdmin.tsVerifica roles System Admin / Super Admin
errorHandler.tsManejo centralizado de errores

Multi-Tenancy

Arquitectura multi-tenant completa con datos lógicamente aislados, roles independientes y aplicaciones habilitadas por separado.

Tenant
├── Members (usuarios)
│   └── Role (admin, member, viewer, personalizado)
│       └── Permissions (resource + action + applicationId)
├── Roles personalizados
└── Apps habilitadas (TenantApp)
    └── User App Access (qué miembros usan qué apps)

RBAC — Control de Acceso Basado en Roles

Cada permiso está vinculado a una aplicación específica y define un par resource:action. Las aplicaciones registran sus recursos mediante /app-resources.

Roles de Sistema

RolDescripción
super_adminAcceso total al sistema. Puede eliminar aplicaciones
system_adminGestión de aplicaciones y tenants
userUsuario regular

Roles de Tenant (Predeterminados)

RolDescripciónModificable
adminAcceso total al tenant (18 permisos SSO)No
memberLectura/escritura estándar (4 permisos)No
viewerSolo lectura (1 permiso)No
PersonalizadosDefinidos por el admin del tenant

Modelo de Datos

Tablas Principales

TablaPropósito
UserUsuarios del sistema (email, passwordHash, systemRole)
TenantOrganizaciones (name, slug)
TenantMemberRelación usuario-tenant con rol
ApplicationApps registradas (appId, name, url)
TenantAppApps habilitadas por tenant
UserAppAccessControl granular de acceso usuario → app → tenant
Role / PermissionRoles personalizables con permisos por app
AppResourceCatálogo de recursos disponibles por aplicación
Session / SSOSession / AppSessionSesiones legacy, SSO y por aplicación
AuthorizationCodeCódigos de un solo uso para el flujo SSO

Decisiones Técnicas Relevantes

¿Por qué Authorization Code Flow?

  • Los tokens nunca se exponen en el frontend
  • El código de autorización es de un solo uso con TTL de 5 minutos
  • Los backends validan directamente con el SSO Core

¿Por qué Cookies HttpOnly?

  • Inmunes a ataques XSS (JavaScript no puede leerlas)
  • Se envían automáticamente en cada request
  • SameSite: lax previene ataques CSRF
  • Secure: true en producción fuerza HTTPS

¿Por qué RS256 y no HS256?

  • La clave privada solo la tiene el SSO Core
  • Las aplicaciones verifican con la clave pública
  • No necesitan conectarse al SSO Core para cada request
  • Endpoint JWKS (/.well-known/jwks.json) distribuye claves

¿Por qué RLS en PostgreSQL?

  • Aislamiento entre tenants a nivel de base de datos
  • Incluso con un bug en la aplicación, los datos de otro tenant no son accesibles
  • Las políticas SQL se aplican transparentemente a todas las queries
sql
-- El middleware establece el tenant activo
SET app.current_tenant_id = 'uuid-del-tenant';

-- La política filtra automáticamente
CREATE POLICY tenant_isolation ON users
USING (tenant_id = current_setting('app.current_tenant_id')::uuid);

Seguridad de Contraseñas

Las contraseñas se almacenan con Argon2 (ganador de la Password Hashing Competition), resistente a ataques con GPUs y ASICs.

Dual Token System

TokenDuraciónPropósito
Access Token1h (configurable)Acceso a recursos protegidos
Refresh Token7d (configurable)Renovar access tokens

Los refresh tokens implementan rotación: cada uso invalida el token anterior y emite uno nuevo.


Dependencias Externas

TecnologíaVersiónPropósito
Node.js18+Runtime server-side
Express4.18Framework HTTP
PrismaORM / Migrations
PostgreSQL14+Persistencia con RLS
Argon2Hashing de contraseñas
jsonwebtokenFirma asimétrica JWT (RS256)
JoiValidación de schemas
express-rate-limitRate limiting por endpoint
Nodemailer / ResendEmail (verificación y notificaciones)