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
| Propriedade | Valor |
|---|---|
| Plataforma | Auth0 (da Okta) |
| Categoria | Identidade e Acesso (Personalizado) |
| Complexidade de configuração | Média |
| Integração oficial | Não |
| Dados sincronizados | Usuários, Eventos, Funções, Identidades |
| Método de autenticação | OAuth 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:
- Uma conta Auth0 com acesso à API
- Uma aplicação Machine-to-Machine registrada no Auth0
- Permissões da Management API concedidas à aplicação M2M
- Uma conta Brevo com acesso à API
- Uma conta Tajo com permissões de conector
Autenticação
OAuth 2.0 Machine-to-Machine
# Create an M2M application in Auth0 Dashboardexport AUTH0_DOMAIN=your-tenant.auth0.comexport AUTH0_CLIENT_ID=your_client_idexport AUTH0_CLIENT_SECRET=your_client_secretexport AUTH0_AUDIENCE=https://your-tenant.auth0.com/api/v2/// Get Management API access tokenconst 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 defaultPermissõ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: 22Mapeamento 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_ROLEEndpoints da API
| Endpoint | Método | Descrição |
|---|---|---|
https://{domain}/api/v2/users | GET | Listar ou buscar usuários |
https://{domain}/api/v2/users/{id} | GET | Obter um usuário |
https://{domain}/api/v2/users/{id} | PATCH | Atualizar metadados do usuário |
https://{domain}/api/v2/users/{id}/roles | GET | Obter funções do usuário |
https://{domain}/api/v2/roles | GET | Listar todas as funções |
https://{domain}/api/v2/logs | GET | Obter eventos de log |
https://{domain}/api/v2/stats/active-users | GET | Obter contagem de usuários ativos |
https://{domain}/api/v2/stats/daily | GET | Obter estatísticas diárias |
https://{domain}/oauth/token | POST | Obter 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 userslet 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 segmentationconst 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 endpoint | Limite | Observações |
|---|---|---|
| Management API | 50 req/seg (Free) | Por tenant |
| Management API | 100 req/seg (Paid) | Por tenant |
| Authentication API | Varia | Baseado no plano |
| Log Streams | Tempo real | Sem limite de taxa na entrega |
| Paginação | 50 itens/página no máximo | Use 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
| Problema | Causa | Solução |
|---|---|---|
| 401 Unauthorized | Token expirado | Solicite novo token M2M (expiração de 24h) |
| 403 Forbidden | Escopos ausentes | Conceda as permissões necessárias ao app M2M |
| Lista de usuários vazia | Erro de consulta de busca | Use a sintaxe Lucene para o mecanismo v3 |
| Metadados ausentes | Metadados não definidos | Verifique user_metadata e app_metadata |
| Limite de taxa 429 | Muitas requisições | Implemente backoff com cabeçalhos de retry |
Modo de depuração
connectors: auth0: debug: true log_level: verbose log_sync: trueMelhores práticas
- Use Log Streams - Streaming de eventos em tempo real em vez de polling da API de Logs
- Implemente paginação - Sempre pagine consultas de lista de usuários para tenants grandes
- Cacheie tokens M2M - Reutilize tokens até próximo da expiração (24h por padrão)
- Use o mecanismo de busca v3 - Use a sintaxe Lucene para buscas eficientes de usuário
- Sincronize apenas usuários verificados - Filtre em
email_verified:truepara evitar contatos não verificados - 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