Конектор Auth0
Свържете Auth0 с Brevo чрез Tajo, за да синхронизирате автентицирани потребителски профили като маркетингови контакти, задействайте автоматизации на базата на събития за автентикация и обогатете данните за клиентите с прозрения от управлението на идентичности и достъп.
Преглед
| Свойство | Стойност |
|---|---|
| Платформа | Auth0 (от Okta) |
| Категория | Identity & Access (Персонализирана) |
| Сложност на настройка | Средна |
| Официална интеграция | Не |
| Синхронизирани данни | Потребители, събития, роли, идентичности |
| Метод на автентикация | Machine-to-Machine OAuth 2.0 |
Функции
- Синхронизация на потребителски профили – Синхронизирайте потребителските профили от Auth0 към контактите в Brevo
- Събития за автентикация – Задействайте автоматизации при login, регистрация и нулиране на парола
- Сегментация на базата на роли – Сегментирайте контактите въз основа на роли и разрешения в Auth0
- Данни от социална идентичност – Обогатете контактите с профилна информация от социален login
- Проследяване на активност за вход – Проследявайте последен вход, брой входове и данни за устройство
- Поддръжка на множество тенанти – Синхронизирайте потребители между множество Auth0 тенанти
Предварителни условия
Преди да започнете, уверете се, че имате:
- Акаунт в Auth0 с API достъп
- Machine-to-Machine приложение, регистрирано в Auth0
- Предоставени Management API разрешения към M2M приложението
- Акаунт в Brevo с API достъп
- Акаунт в Tajo с разрешения за конектори
Автентикация
Machine-to-Machine OAuth 2.0
# 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 defaultAPI разрешения
Предоставяйте само необходимите обхвати на вашето M2M приложение: read:users, read:user_idp_tokens, read:roles и read:logs. Избягвайте предоставянето на разрешения за писане, освен ако не е необходимо.
Конфигурация
Основна настройка
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Мапване на полета
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_ROLEAPI крайни точки
| Endpoint | Method | Описание |
|---|---|---|
https://{domain}/api/v2/users | GET | Списък или търсене на потребители |
https://{domain}/api/v2/users/{id} | GET | Извличане на потребител |
https://{domain}/api/v2/users/{id} | PATCH | Обновяване на потребителски метаданни |
https://{domain}/api/v2/users/{id}/roles | GET | Извличане на роли на потребител |
https://{domain}/api/v2/roles | GET | Списък на всички роли |
https://{domain}/api/v2/logs | GET | Извличане на log събития |
https://{domain}/api/v2/stats/active-users | GET | Извличане на броя активни потребители |
https://{domain}/api/v2/stats/daily | GET | Извличане на дневна статистика |
https://{domain}/oauth/token | POST | Извличане на токен за достъп |
Примери за код
Инициализация на конектора
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});Синхронизация на потребители към 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;}Проследяване на събития за автентикация чрез 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');});Сегментация на базата на роли
// 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') }});Лимити на заявки
| Категория крайни точки | Лимит | Забележки |
|---|---|---|
| Management API | 50 заявки/сек (Free) | За тенант |
| Management API | 100 заявки/сек (Paid) | За тенант |
| Authentication API | Варира | На базата на плана |
| Log Streams | В реално време | Без лимит на заявки за доставката |
| Пагинация | Максимум 50 елемента/страница | Използвайте параметрите page и per_page |
Изисква се пагинация
Auth0 Management API връща максимум 50 резултата на страница. Винаги прилагайте пагинация чрез параметрите page и per_page. Включете include_totals=true, за да получите общия брой.
Отстраняване на проблеми
| Проблем | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Изтекъл токен | Заявете нов M2M токен (24ч валидност) |
| 403 Forbidden | Липсващи обхвати | Предоставете необходимите разрешения на M2M приложението |
| Празен списък на потребители | Грешка в заявката за търсене | Използвайте Lucene синтаксис за v3 engine |
| Липсващи метаданни | Метаданните не са зададени | Проверете user_metadata и app_metadata |
| Rate limit 429 | Твърде много заявки | Приложете отлагане с retry хедърите |
Debug режим
connectors: auth0: debug: true log_level: verbose log_sync: trueНай-добри практики
- Използвайте Log Streams – Стрийминг на събития в реално време вместо допитване на Logs API
- Имплементирайте пагинация – Винаги пагинирайте заявките за списъци с потребители за големи тенанти
- Кеширайте M2M токените – Използвайте повторно токените до близо до изтичане (24ч по подразбиране)
- Използвайте search engine v3 – Използвайте Lucene синтаксис за ефективни потребителски търсения
- Синхронизирайте само верифицирани потребители – Филтрирайте по
email_verified:true, за да избегнете неверифицирани контакти - Използвайте потребителски метаданни – Съхранявайте персонализирани атрибути в Auth0 user_metadata за синхронизация
Сигурност
- Machine-to-Machine OAuth – Client credentials grant за server-to-server автентикация
- Обхватни разрешения – Предоставяйте минимално необходимите Management API обхвати
- Ротация на токени – M2M токените изтичат след 24 часа по подразбиране
- Автентикация на Log Stream – Използвайте bearer token верификация за webhook крайни точки
- Изолация на тенанти – Отделни конфигурации за всеки Auth0 тенант
- Криптиран транспорт – TLS 1.2+ за всички API комуникации