Conector Auth0

Conecte o Auth0 ao Brevo através do Tajo para sincronizar perfis de usuários autenticados como contatos de marketing, disparar automações com base em eventos de autenticação e enriquecer seus dados de clientes com insights de gestão de identidade e acesso.

Visão geral

PropriedadeValor
PlataformaAuth0 (da Okta)
CategoriaIdentidade e Acesso (Personalizado)
Complexidade de configuraçãoMédia
Integração oficialNão
Dados sincronizadosUsuários, Eventos, Funções, Identidades
Método de autenticaçãoOAuth 2.0 Machine-to-Machine

Recursos

  • Sincronização de perfil de usuário - Sincronize perfis de usuário do Auth0 para contatos do Brevo
  • Eventos de autenticação - Dispare automações em login, signup e redefinição de senha
  • Segmentação baseada em função - Segmente contatos com base em funções e permissões do Auth0
  • Dados de identidade social - Enriqueça contatos com informações de perfil de login social
  • Rastreamento de atividade de login - Acompanhe último login, contagem de logins e dados de dispositivo
  • Suporte multi-tenant - Sincronize usuários em múltiplos tenants do Auth0

Pré-requisitos

Antes de começar, certifique-se de que você tem:

  1. Uma conta Auth0 com acesso à API
  2. Uma aplicação Machine-to-Machine registrada no Auth0
  3. Permissões da Management API concedidas à aplicação M2M
  4. Uma conta Brevo com acesso à API
  5. Uma conta Tajo com permissões de conector

Autenticação

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

Permissões de API

Conceda apenas os escopos necessários à sua aplicação M2M: read:users, read:user_idp_tokens, read:roles e read:logs. Evite conceder permissões de escrita a menos que necessário.

Configuração

Configuração 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

Mapeamento 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 da API

EndpointMétodoDescrição
https://{domain}/api/v2/usersGETListar ou buscar usuários
https://{domain}/api/v2/users/{id}GETObter um usuário
https://{domain}/api/v2/users/{id}PATCHAtualizar metadados do usuário
https://{domain}/api/v2/users/{id}/rolesGETObter funções do usuário
https://{domain}/api/v2/rolesGETListar todas as funções
https://{domain}/api/v2/logsGETObter eventos de log
https://{domain}/api/v2/stats/active-usersGETObter contagem de usuários ativos
https://{domain}/api/v2/stats/dailyGETObter estatísticas diárias
https://{domain}/oauth/tokenPOSTObter token de acesso

Exemplos de código

Inicializar o 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 usuários para o 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 autenticação via 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');
});

Segmentação baseada em função

// 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')
}
});

Limites de taxa

Categoria de endpointLimiteObservações
Management API50 req/seg (Free)Por tenant
Management API100 req/seg (Paid)Por tenant
Authentication APIVariaBaseado no plano
Log StreamsTempo realSem limite de taxa na entrega
Paginação50 itens/página no máximoUse os parâmetros page e per_page

Paginação obrigatória

A Management API do Auth0 retorna no máximo 50 resultados por página. Sempre implemente paginação usando os parâmetros page e per_page. Inclua include_totals=true para obter a contagem total.

Solução de problemas

ProblemaCausaSolução
401 UnauthorizedToken expiradoSolicite novo token M2M (expiração de 24h)
403 ForbiddenEscopos ausentesConceda as permissões necessárias ao app M2M
Lista de usuários vaziaErro de consulta de buscaUse a sintaxe Lucene para o mecanismo v3
Metadados ausentesMetadados não definidosVerifique user_metadata e app_metadata
Limite de taxa 429Muitas requisiçõesImplemente backoff com cabeçalhos de retry

Modo de depuração

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

Melhores práticas

  1. Use Log Streams - Streaming de eventos em tempo real em vez de polling da API de Logs
  2. Implemente paginação - Sempre pagine consultas de lista de usuários para tenants grandes
  3. Cacheie tokens M2M - Reutilize tokens até próximo da expiração (24h por padrão)
  4. Use o mecanismo de busca v3 - Use a sintaxe Lucene para buscas eficientes de usuário
  5. Sincronize apenas usuários verificados - Filtre em email_verified:true para evitar contatos não verificados
  6. Aproveite os metadados de usuário - Armazene atributos personalizados em user_metadata do Auth0 para sincronização

Segurança

  • OAuth Machine-to-Machine - Client credentials grant para autenticação servidor-para-servidor
  • Permissões com escopo - Conceda os escopos mínimos necessários da Management API
  • Rotação de token - Tokens M2M expiram em 24 horas por padrão
  • Autenticação de Log Stream - Use verificação de bearer token para endpoints de webhook
  • Isolamento de tenant - Configurações separadas por tenant do Auth0
  • Transporte criptografado - TLS 1.2+ para todas as comunicações com a API

Recursos relacionados

Subscribe to updates

developer-docs

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

auto-detect
Assistente AI

Olá! Pergunte-me qualquer coisa sobre a documentação.