Skip to content

Metadata

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

SSO Core — Onboarding

Propósito del Sistema

SSO Core es un Identity Provider (IdP) centralizado que implementa un flujo de Authorization Code inspirado en OAuth 2.0 con cookies HttpOnly.

Proporciona:

  • Autenticación centralizada — Authorization Code Flow con códigos de un solo uso
  • Multi-tenancy — Aislamiento de datos con Row-Level Security (RLS) en PostgreSQL
  • RBAC granular — Roles y permisos por aplicación y por tenant
  • 2FA — Autenticación de dos factores con TOTP y códigos de respaldo
  • Gestión de aplicaciones — Registro centralizado, control por tenant y acceso por usuario

Dependencias

SoftwareVersión MínimaNotas
Node.js18+Recomendado: LTS
PostgreSQL14+O vía Docker
npm9+Incluido con Node.js
OpenSSL1.1+Para generar claves JWT

Stack Tecnológico

TecnologíaPropósito
Node.js + Express 4.18Backend API
PostgreSQL + PrismaBase de datos con ORM
JWT (RS256)Tokens de autenticación (firma asimétrica)
Argon2Hashing de contraseñas
JoiValidación de schemas
express-rate-limitProtección por endpoint
Nodemailer / ResendVerificación y notificaciones

Instrucciones de Setup

1. Clonar el repositorio

bash
git clone <repo-url>
cd sso-core

2. Instalar dependencias

bash
npm install

3. Configurar variables de entorno

bash
cp .env.example .env

Variables mínimas requeridas:

bash
# Base de datos
DB_TYPE=postgresql
DB_HOST=localhost
DB_PORT=5432
DB_NAME=sso_dev
DB_USER=postgres
DB_PASSWORD=tu_password

# JWT (obligatorio)
JWT_SECRET=tu-secreto-seguro-aqui

4. Generar claves RSA para JWT

El sistema utiliza firma asimétrica RS256:

bash
mkdir -p keys
openssl genpkey -algorithm RSA -out keys/private.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in keys/private.pem -out keys/public.pem

Configurar en .env:

bash
PRIVATE_KEY_PATH=./keys/private.pem
PUBLIC_KEY_PATH=./keys/public.pem

⚠️ Nunca incluyas las claves privadas en el repositorio. Asegúrate de que keys/ está en .gitignore.

5. Iniciar la base de datos

Con Docker (recomendado):

bash
docker-compose up -d postgres

Sin Docker — asegúrate de que PostgreSQL está corriendo:

bash
createdb sso_dev

6. Ejecutar migraciones

bash
npm run migrate up

7. Generar el cliente Prisma

bash
npx prisma generate

8. Ejecutar el seed inicial

bash
npm run seed:complete

El seed crea un usuario SuperAdmin por defecto. Revisa la salida del comando para obtener las credenciales iniciales.


Ejecución Local

bash
npm run dev

Verificar que el servidor está corriendo:

bash
curl http://localhost:3000/health

Respuesta esperada:

json
{
  "status": "ok"
}

Prueba rápida de registro y login

Registrar un usuario:

bash
curl -X POST http://localhost:3000/api/v1/auth/signup \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "SecurePass123!",
    "firstName": "Test",
    "lastName": "User"
  }'

Iniciar sesión:

bash
curl -X POST http://localhost:3000/api/v1/auth/signin \
  -H "Content-Type: application/json" \
  -c cookies.txt \
  -d '{
    "nuid": "test@example.com",
    "password": "SecurePass123!"
  }'

Obtener perfil:

bash
curl http://localhost:3000/api/v1/user/profile \
  -b cookies.txt

Estructura del Proyecto

sso-core/
├── src/
│   ├── routes/          # Endpoints de la API
│   ├── services/        # Lógica de negocio
│   ├── repositories/    # Capa de acceso a datos (Prisma)
│   ├── middleware/       # Auth, SSO, error handling
│   ├── config/          # Sistema de configuración
│   └── utils/           # Utilidades (logger, helpers)
├── prisma/
│   └── schema.prisma    # Definición del esquema de BD
├── migrations/          # Migraciones de base de datos
├── keys/                # Claves JWT (no versionado)
└── config.yaml          # Configuración declarativa

Configuración Detallada

Sistema de configuración de tres capas

Variables de Entorno (.env) > _value (config.yaml) > _default (config.yaml)

Variables Obligatorias

CampoVariable de EntornoDescripción
database.typeDB_TYPETipo de BD (postgresql)
database.hostDB_HOSTHost de la base de datos
database.portDB_PORTPuerto de la base de datos
database.nameDB_NAMENombre de la base de datos
database.userDB_USERUsuario de la base de datos
database.passwordDB_PASSWORDContraseña de la BD
jwt.secretJWT_SECRETSecreto para firmar tokens JWT

Valores por Defecto

CampoDefaultDescripción
port3567Puerto del servidor
hostlocalhostHost del servidor
jwt.algorithmHS256Algoritmo JWT
access_token_validity3600Validez del access token (1h)
refresh_token_validity604800Validez del refresh token (7d)
session.expiry_time3600Expiración de sesión (1h)
logging.levelinfoNivel de logging
cors.enabledtrueCORS habilitado

Problemas Comunes

"Mandatory field missing"

La aplicación no inicia si falta un campo obligatorio. Solución:

bash
export JWT_SECRET="my-secret-key"
# o
echo "JWT_SECRET=my-secret-key" >> .env

.env no se lee

El ConfigManager no carga .env automáticamente. Asegúrate de usar dotenv:

typescript
import dotenv from 'dotenv';
dotenv.config();
await Config.load();

Default no se aplica

Si el campo tiene un valor vacío "" en config.yaml, el default no se aplica. Usa null o elimina el campo.


Canales de Soporte

CanalPropósito
#sso-coreSoporte general y consultas
Documentación técnicaArquitectura, API Reference, Database Schema
RepositorioIssues y Pull Requests