Motor de Acciones
El Motor de Acciones te permite extender los flujos de autenticación de Auris con código JavaScript personalizado. Las acciones son hooks que se ejecutan en puntos específicos del pipeline de autenticación — antes del inicio de sesión, después del inicio de sesión, antes del registro, etc. — permitiéndote implementar lógica de negocio personalizada sin modificar la plataforma Auris.
Usos habituales de las acciones:
- Agregar datos personalizados a tokens JWT (departamento, nivel de suscripción, feature flags)
- Bloquear inicios de sesión según condiciones de negocio (dominio de email, estado de cuenta en un sistema externo)
- Registrar eventos de autenticación en una plataforma SIEM o analítica externa
- Aplicar validaciones adicionales antes del registro de usuarios
- Integrarse con sistemas de gobernanza de identidad
Disparadores
Las acciones están asociadas a un disparador, que define cuándo se ejecuta la acción en el pipeline de autenticación. Un mismo disparador puede tener múltiples acciones, que se ejecutan en el orden configurado.
| Disparador | Cuándo se ejecuta |
|---|---|
| Pre-Login | Antes de que se verifiquen las credenciales de autenticación. Se ejecuta en todos los intentos de inicio de sesión, incluidos los que finalmente fallen. |
| Post-Login | Tras una autenticación exitosa. Se ejecuta después de que se complete el MFA (si es obligatorio). El token aún no ha sido emitido. |
| Pre-Signup | Antes de que se cree una nueva cuenta de usuario. Permite bloquear registros según el email, dominio u otras condiciones. |
| Post-Signup | Tras la creación exitosa de una nueva cuenta de usuario. |
| Post-Change-Password | Tras el cambio de contraseña exitoso por parte del usuario. |
| Pre-M2M-Token | Antes de emitir un token de credenciales de cliente M2M. Permite bloquear o modificar la emisión de tokens M2M. |
Nota: Post-Login es el disparador más utilizado y el mejor punto de partida para la mayoría de los casos de uso (agregar claims, registrar eventos). Usa Pre-Login con moderación, ya que se ejecuta en cada intento de inicio de sesión, incluidos los fallidos, lo que puede afectar al rendimiento bajo carga elevada.
La Lista de Acciones
Ve a Consola → Acciones para ver todas las acciones de tu tenant.
La lista muestra:
| Columna | Descripción |
|---|---|
| Nombre | Nombre de la acción |
| Disparador | Punto de disparo al que está asociada la acción |
| Estado | Activa o Inactiva |
| Última Ejecución | Timestamp de la ejecución más reciente |
| Ejecuciones Totales | Número total de veces que se ha ejecutado la acción |
| Errores Totales | Total de errores de ejecución |
Las acciones se ordenan por disparador y orden de ejecución. Dentro del mismo disparador, el número en la columna Orden determina la secuencia de ejecución.
Crear una Acción
Hacer clic en Crear
Desde la lista de acciones, haz clic en Crear Acción.
Introducir un nombre y seleccionar un disparador
| Campo | Obligatorio | Descripción |
|---|---|---|
| Nombre | Sí | Un nombre descriptivo (por ejemplo, “Agregar Claim de Departamento”, “Bloquear Dominios Competidores”) |
| Disparador | Sí | El evento del flujo de autenticación al que responde esta acción |
| Tiempo límite | No | Tiempo máximo de ejecución en milisegundos. Por defecto: 5000 (5 segundos). |
Escribir el código de la acción
El editor de código se abre de inmediato. Escribe la lógica de tu acción en JavaScript. Consulta Escribir Código de Acción para la referencia completa de la API.
Guardar
Haz clic en Guardar. La acción se guarda pero aún no está activa.
Activar
Activa el interruptor Activo para habilitar la acción. Las acciones inactivas se guardan pero no se ejecutan.
Escribir Código de Acción
El Objeto Context
Cada acción recibe un único argumento context. Su estructura depende del disparador:
// estructura de context para el disparador Post-Login
{
user: {
id: 'usr_abc123',
email: '[email protected]',
emailVerified: true,
firstName: 'Alice',
lastName: 'Smith',
username: 'alice',
roles: ['editor', 'viewer'],
metadata: {
department: 'engineering',
subscription_tier: 'pro',
},
createdAt: '2024-01-15T10:30:00Z',
lastLoginAt: '2025-02-10T08:15:00Z',
},
application: {
id: 'app_xyz789',
name: 'Main Web App',
clientId: 'your-client-id',
type: 'WEB',
},
connection: {
strategy: 'email-password', // o 'google', 'github', 'saml', etc.
name: 'Username-Password-Authentication',
},
request: {
ip: '203.0.113.42',
userAgent: 'Mozilla/5.0 ...',
geoip: {
country: 'IT',
region: 'Lombardy',
city: 'Milan',
},
},
tenant: {
id: 'your-tenant-id',
name: 'Acme Corp',
},
}Para Pre-M2M-Token, el campo user no está presente y en su lugar el context contiene application y scopes (los scopes M2M solicitados).
El Valor de Retorno
Cada acción debe devolver un objeto ActionResult:
type ActionResult = {
allow: boolean // Si el flujo de autenticación debe continuar
message?: string // Mensaje de error mostrado al usuario si allow: false
claims?: Record<string, unknown> // Claims a agregar al JWT
metadata?: Record<string, unknown> // Actualizaciones de metadatos del usuario (persistidas)
}Si tu acción lanza una excepción no controlada, el flujo de autenticación es bloqueado por defecto para fallar de forma segura. Envuelve siempre la lógica que pueda lanzar errores en try/catch si deseas que los fallos no sean bloqueantes.
Acciones de Ejemplo
Bloquear inicio de sesión por dominio de email
// Bloquear inicios de sesión de emails de un dominio competidor
const blockedDomains = ['competitor.com', 'blockeddomain.org']
const emailDomain = context.user.email.split('@')[1]
if (blockedDomains.includes(emailDomain)) {
return {
allow: false,
message: 'Tu organización no tiene acceso a esta aplicación.',
}
}
return { allow: true }Agregar claims personalizados al JWT
// Incluir departamento y nivel de suscripción en cada token
return {
allow: true,
claims: {
department: context.user.metadata?.department || 'general',
tier: context.user.metadata?.subscription_tier || 'free',
org_region: context.user.metadata?.region || 'eu',
},
}Claim basado en rol
// Establecer un claim 'plan' según el rol del usuario
const roles = context.user.roles || []
let plan = 'free'
if (roles.includes('enterprise')) plan = 'enterprise'
else if (roles.includes('pro')) plan = 'pro'
else if (roles.includes('starter')) plan = 'starter'
return {
allow: true,
claims: { plan },
}Registrar en un webhook externo (fire-and-forget)
// Registro no bloqueante en un sistema externo
// Usar try/catch para que un fallo del webhook no bloquee el inicio de sesión
try {
const payload = JSON.stringify({
event: 'user.login',
userId: context.user.id,
email: context.user.email,
ip: context.request.ip,
timestamp: new Date().toISOString(),
})
// Nota: fetch está disponible en el sandbox de la acción
fetch('https://your-siem.example.com/events', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer your-key' },
body: payload,
})
} catch (e) {
// Ignorar silenciosamente los fallos del webhook — no bloquear el inicio de sesión
}
return { allow: true }Bloquear token M2M si el scope no está permitido para esta aplicación
// Pre-M2M-Token: solo permitir el scope 'read:reports' para aplicaciones específicas
const allowedApps = ['app_reporting_service', 'app_analytics']
if (context.scopes.includes('read:reports') && !allowedApps.includes(context.application.id)) {
return {
allow: false,
message: 'Esta aplicación no está autorizada a solicitar el scope read:reports.',
}
}
return { allow: true }Entorno de Ejecución en Sandbox
Las acciones se ejecutan en un sandbox JavaScript restringido. Lo siguiente está disponible:
| Disponible | Descripción |
|---|---|
fetch | Realizar solicitudes HTTP salientes |
JSON | Parsear y serializar JSON |
Date | Operaciones de fecha y hora |
Math | Operaciones matemáticas |
String, Array, Object | Built-ins estándar de JavaScript |
console.log | Escribe en el log de ejecución de la acción (visible en Logs de Acciones) |
Lo siguiente está bloqueado y lanzará un error si se usa:
| Bloqueado | Motivo |
|---|---|
require, import | Sin carga de módulos — el sandbox está aislado |
process | Sin acceso al proceso Node.js |
eval, constructor Function | Sin ejecución de código dinámico |
global, globalThis | Sin acceso al estado global |
child_process | Sin ejecución de subprocesos |
fs | Sin acceso al sistema de archivos |
Tiempo Límite
Las acciones tienen un tiempo límite configurable (por defecto: 5000 ms). Si la ejecución supera el tiempo límite, la acción se termina y el flujo de autenticación es bloqueado como si se hubiera devuelto allow: false. Establece un tiempo límite corto para las acciones que realizan llamadas HTTP externas para evitar retrasar la experiencia de inicio de sesión del usuario.
Orden de Ejecución
Cuando múltiples acciones están asociadas al mismo disparador, se ejecutan secuencialmente en el orden mostrado en la lista de acciones. Si alguna acción devuelve { allow: false }, la ejecución se detiene y las acciones siguientes no se ejecutan.
Reordenar Acciones
En la página de lista de acciones, filtra por disparador. Arrastra el controlador de orden (el icono de seis puntos) en cualquier fila de acción para cambiar su posición. El nuevo orden se guarda automáticamente.
Editor Blueprint
Para usuarios que prefieren un enfoque visual para definir la lógica de las acciones, Auris ofrece el Editor Blueprint — un editor basado en nodos al estilo Unreal Engine para construir reglas de acciones sin escribir código.
Accede al Editor Blueprint en la página de detalle de cualquier acción haciendo clic en la pestaña Blueprint.
Tipos de Nodos
| Nodo | Categoría | Descripción |
|---|---|---|
| Disparador | Naranja | Punto de entrada — el evento disparador que inicia el flujo |
| Condición | Cian | Una comparación de campo individual (campo, operador, valor) |
| Puerta Lógica | Violeta | Combinador AND u OR para múltiples condiciones |
| Acción de Denegación | Rosa | Devuelve { allow: false } con un mensaje configurable |
| Establecer Claims | Azul | Agrega pares clave-valor a los claims del JWT |
| Establecer Metadatos | Esmeralda | Actualiza campos de metadatos del usuario (persistidos en el registro del usuario) |
| Log | Verde | Escribe un mensaje en el log de ejecución de la acción |
Usar el Editor Blueprint
- El nodo Disparador se coloca automáticamente a la izquierda
- Haz clic en Agregar Condición en la barra de herramientas para colocar un nodo de condición. Conéctalo al disparador o a una puerta lógica.
- Haz clic en Agregar Puerta Lógica para combinar múltiples condiciones con lógica AND/OR
- Conecta las salidas de condición a los nodos de acción (Denegar, Establecer Claims, etc.)
- Haz clic en Auto-Layout para reorganizar los nodos automáticamente
- Haz clic en Guardar — el blueprint se serializa a JavaScript y se guarda como código de la acción
El Editor Blueprint y el editor de código están sincronizados. Al cambiar entre ellos se muestra la representación en código del blueprint actual. El código escrito manualmente puede no ser siempre representable en el Editor Blueprint — las expresiones complejas se conservan como código pero no son editables visualmente.
Logs de Acciones
La pestaña Logs en la página de detalle de cualquier acción muestra el historial de ejecución de esa acción.
| Columna | Descripción |
|---|---|
| Timestamp | Cuándo se ejecutó la acción |
| Disparador | El evento que provocó la ejecución |
| Duración | Tiempo de ejecución en milisegundos |
| Estado | Éxito, Error o Timeout |
| Error | Mensaje de error si el estado es Error o Timeout |
Haz clic en cualquier entrada del log para expandirla y ver:
- Datos de context completos pasados a la acción (con campos sensibles redactados)
- Valor de retorno de la acción
- Salida de consola (llamadas
console.logdesde el código de la acción) - Stack trace del error (si ocurrió un error)
Filtrar Logs
Usa el selector de rango de fechas y el filtro de estado en la parte superior de la pestaña Logs para acotar la vista. Los logs se conservan por defecto durante 30 días.
Guías Relacionadas
- Flujo de Login Alojado — Cómo encajan las Acciones en el flujo de código de autorización OAuth 2.0
- Claims Personalizados — Configuración alternativa de claims sin código (para claims estáticos o basados en atributos)
- API de Acciones — Gestionar acciones de forma programática
- Integración con Webhooks — Webhooks salientes como alternativa para integraciones orientadas a eventos sin código en el path de autenticación