Conector de Auth0

Conecta Auth0 con Brevo a través de Tajo para sincronizar los perfiles de usuarios autenticados como contactos de marketing, activar automatizaciones a partir de eventos de autenticación y enriquecer tus datos de clientes con información de gestión de identidades y accesos.

Resumen

PropiedadValor
PlataformaAuth0 (de Okta)
CategoríaIdentidad y Acceso (Personalizada)
Complejidad de configuraciónMedia
Integración oficialNo
Datos sincronizadosUsuarios, Eventos, Roles, Identidades
Método de autenticaciónOAuth 2.0 Machine-to-Machine

Funcionalidades

  • Sincronización de perfiles de usuario - Sincroniza los perfiles de Auth0 con contactos de Brevo
  • Eventos de autenticación - Activa automatizaciones en el login, registro y restablecimiento de contraseña
  • Segmentación por roles - Segmenta contactos según los roles y permisos de Auth0
  • Datos de identidad social - Enriquece contactos con información del perfil de login social
  • Seguimiento de actividad de login - Rastrea el último login, conteo de logins y datos de dispositivo
  • Soporte multi-tenant - Sincroniza usuarios entre varios tenants de Auth0

Requisitos previos

Antes de empezar, asegúrate de tener:

  1. Una cuenta de Auth0 con acceso a la API
  2. Una aplicación Machine-to-Machine registrada en Auth0
  3. Permisos de la Management API concedidos a la aplicación M2M
  4. Una cuenta de Brevo con acceso a la API
  5. Una cuenta de Tajo con permisos de conector

Autenticación

OAuth 2.0 Machine-to-Machine

Terminal window
# Create an M2M application in Auth0 Dashboard
export AUTH0_DOMAIN=your-tenant.auth0.com
export AUTH0_CLIENT_ID=your_client_id
export AUTH0_CLIENT_SECRET=your_client_secret
export AUTH0_AUDIENCE=https://your-tenant.auth0.com/api/v2/
// Get Management API access token
const tokenResponse = await fetch(
`https://${process.env.AUTH0_DOMAIN}/oauth/token`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
client_id: process.env.AUTH0_CLIENT_ID,
client_secret: process.env.AUTH0_CLIENT_SECRET,
audience: process.env.AUTH0_AUDIENCE,
grant_type: 'client_credentials'
})
}
);
const { access_token } = await tokenResponse.json();
// Token is valid for 24 hours by default

Permisos de la API

Concede solo los scopes necesarios a tu aplicación M2M: read:users, read:user_idp_tokens, read:roles y read:logs. Evita conceder permisos de escritura salvo que sea imprescindible.

Configuración

Configuración básica

connectors:
auth0:
enabled: true
domain: "${AUTH0_DOMAIN}"
client_id: "${AUTH0_CLIENT_ID}"
client_secret: "${AUTH0_CLIENT_SECRET}"
audience: "https://${AUTH0_DOMAIN}/api/v2/"
sync:
users: true
events: true
roles: true
schedule: "0 */4 * * *" # Every 4 hours
lists:
all_users: 20
verified_users: 21
social_login: 22

Asignación de campos

field_mapping:
email: email
given_name: FIRSTNAME
family_name: LASTNAME
nickname: NICKNAME
picture: AVATAR_URL
email_verified: EMAIL_VERIFIED
logins_count: LOGIN_COUNT
last_login: LAST_LOGIN_DATE
created_at: SIGNUP_DATE
user_metadata.phone: SMS
user_metadata.company: COMPANY
app_metadata.plan: SUBSCRIPTION_PLAN
app_metadata.role: USER_ROLE

Endpoints de la API

EndpointMétodoDescripción
https://{domain}/api/v2/usersGETListar o buscar usuarios
https://{domain}/api/v2/users/{id}GETObtener un usuario
https://{domain}/api/v2/users/{id}PATCHActualizar los metadatos del usuario
https://{domain}/api/v2/users/{id}/rolesGETObtener los roles del usuario
https://{domain}/api/v2/rolesGETListar todos los roles
https://{domain}/api/v2/logsGETObtener eventos de log
https://{domain}/api/v2/stats/active-usersGETObtener el número de usuarios activos
https://{domain}/api/v2/stats/dailyGETObtener estadísticas diarias
https://{domain}/oauth/tokenPOSTObtener un token de acceso

Ejemplos de código

Inicializar el conector

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('auth0', {
domain: process.env.AUTH0_DOMAIN,
clientId: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET
});

Sincronizar usuarios con Brevo

// Paginate through Auth0 users
let page = 0;
const perPage = 50;
let hasMore = true;
while (hasMore) {
const response = await fetch(
`https://${domain}/api/v2/users?` +
new URLSearchParams({
page: page.toString(),
per_page: perPage.toString(),
include_totals: 'true',
search_engine: 'v3',
q: 'email_verified:true'
}),
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
const { users, total } = await response.json();
for (const user of users) {
await tajo.contacts.sync({
email: user.email,
attributes: {
FIRSTNAME: user.given_name,
LASTNAME: user.family_name,
LOGIN_COUNT: user.logins_count,
LAST_LOGIN_DATE: user.last_login,
SIGNUP_DATE: user.created_at,
EMAIL_VERIFIED: user.email_verified
},
listIds: [20]
});
}
page++;
hasMore = (page * perPage) < total;
}

Rastrear eventos de autenticación vía Log Streams

// Set up Auth0 Log Stream webhook
// Configure in Auth0 Dashboard > Monitoring > Streams
app.post('/webhooks/auth0', async (req, res) => {
// Verify authorization header
const authHeader = req.headers.authorization;
if (authHeader !== `Bearer ${process.env.AUTH0_WEBHOOK_TOKEN}`) {
return res.status(401).send('Unauthorized');
}
const logs = req.body;
for (const log of logs) {
switch (log.data.type) {
case 's': // Successful login
await tajo.events.track({
email: log.data.details.email,
event: 'user_login',
properties: {
ip: log.data.ip,
user_agent: log.data.user_agent,
connection: log.data.connection
}
});
break;
case 'ss': // Successful signup
await tajo.contacts.sync({
email: log.data.details.email,
attributes: { SIGNUP_DATE: log.data.date },
listIds: [20]
});
break;
case 'sp': // Successful password change
await tajo.events.track({
email: log.data.details.email,
event: 'password_changed'
});
break;
}
}
res.status(200).send('OK');
});

Segmentación basada en roles

// Sync user roles for segmentation
const rolesResponse = await fetch(
`https://${domain}/api/v2/users/${userId}/roles`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
const roles = await rolesResponse.json();
const roleNames = roles.map(r => r.name).join(', ');
await tajo.contacts.update(userEmail, {
attributes: {
USER_ROLE: roleNames,
IS_ADMIN: roles.some(r => r.name === 'admin')
}
});

Límites de velocidad

Categoría de endpointLímiteNotas
Management API50 req/s (Free)Por tenant
Management API100 req/s (Paid)Por tenant
Authentication APIVaríaSegún el plan
Log StreamsTiempo realSin límite de velocidad en la entrega
Paginación50 elementos/página máx.Usa los parámetros page y per_page

Paginación obligatoria

La Management API de Auth0 devuelve un máximo de 50 resultados por página. Implementa siempre la paginación usando los parámetros page y per_page. Incluye include_totals=true para obtener el total.

Resolución de problemas

ProblemaCausaSolución
401 UnauthorizedToken expiradoSolicita un token M2M nuevo (expiración de 24 h)
403 ForbiddenFaltan scopesConcede los permisos necesarios a la app M2M
Lista de usuarios vacíaError en la query de búsquedaUsa sintaxis Lucene para el motor v3
Metadatos ausentesMetadatos no establecidosRevisa user_metadata y app_metadata
429 por límite de velocidadDemasiadas peticionesAplica backoff usando las cabeceras de reintento

Modo depuración

connectors:
auth0:
debug: true
log_level: verbose
log_sync: true

Buenas prácticas

  1. Usa Log Streams - Streaming de eventos en tiempo real en lugar de consultar la Logs API por polling
  2. Implementa paginación - Pagina siempre las consultas de lista de usuarios en tenants grandes
  3. Cachea los tokens M2M - Reutiliza los tokens hasta cerca de su expiración (24 h por defecto)
  4. Usa el motor de búsqueda v3 - Usa sintaxis Lucene para búsquedas de usuario eficientes
  5. Sincroniza solo usuarios verificados - Filtra por email_verified:true para evitar contactos sin verificar
  6. Aprovecha user_metadata - Guarda atributos personalizados en user_metadata de Auth0 para sincronizarlos

Seguridad

  • OAuth Machine-to-Machine - Flujo client credentials para auth servidor a servidor
  • Permisos con scope - Concede los scopes mínimos necesarios de la Management API
  • Rotación de tokens - Los tokens M2M expiran a las 24 horas por defecto
  • Auth de Log Stream - Usa verificación por bearer token para endpoints de webhook
  • Aislamiento de tenants - Configuraciones separadas por tenant de Auth0
  • Transporte cifrado - TLS 1.2+ para toda la comunicación con la API

Recursos relacionados

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Asistente AI

¡Hola! Pregúntame lo que quieras sobre la documentación.