Auth0 Connector
Poveži Auth0 z Brevo prek Tajo za sinhronizacijo profilov avtenticiranih uporabnikov kot marketinških stikov, sprožanje avtomatizacij na osnovi dogodkov avtentikacije in obogatitev podatkov o strankah z vpogledi v upravljanje identitet in dostopa.
Pregled
| Lastnost | Vrednost |
|---|---|
| Platforma | Auth0 (by Okta) |
| Kategorija | Identiteta in dostop (po meri) |
| Zahtevnost nastavitve | Srednja |
| Uradna integracija | Ne |
| Sinhronizirani podatki | Uporabniki, dogodki, vloge, identitete |
| Metoda avtentikacije | Machine-to-Machine OAuth 2.0 |
Funkcionalnosti
- Sinhronizacija profilov uporabnikov – sinhronizacija profilov uporabnikov Auth0 s stiki Brevo
- Dogodki avtentikacije – sprožanje avtomatizacij ob prijavi, registraciji in ponastavitvi gesla
- Segmentacija na osnovi vlog – segmentiraj stike glede na vloge in dovoljenja Auth0
- Podatki o socialni identiteti – obogati stike s podatki iz profilov socialnih prijav
- Sledenje aktivnosti prijave – sledi zadnji prijavi, številu prijav in podatkom naprave
- Podpora za več najemnikov – sinhronizacija uporabnikov med več najemniki Auth0
Predpogoji
Preden začneš, se prepričaj, da imaš:
- Račun Auth0 z dostopom do API
- V Auth0 registrirano Machine-to-Machine aplikacijo
- Dovoljenja Management API dodeljena M2M aplikaciji
- Brevo račun z dostopom do API
- Tajo račun z dovoljenji za konektorje
Avtentikacija
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 defaultDovoljenja API
M2M aplikaciji dodeli samo zahtevane obsege: read:users, read:user_idp_tokens, read:roles in read:logs. Izogibaj se dodeljevanju dovoljenj za pisanje, razen če je to nujno.
Konfiguracija
Osnovna nastavitev
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: 22Preslikava polj
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_ROLEKončne točke API
| Končna točka | Metoda | Opis |
|---|---|---|
https://{domain}/api/v2/users | GET | Seznam ali iskanje uporabnikov |
https://{domain}/api/v2/users/{id} | GET | Pridobi uporabnika |
https://{domain}/api/v2/users/{id} | PATCH | Posodobi metapodatke uporabnika |
https://{domain}/api/v2/users/{id}/roles | GET | Pridobi vloge uporabnika |
https://{domain}/api/v2/roles | GET | Seznam vseh vlog |
https://{domain}/api/v2/logs | GET | Pridobi dnevniške dogodke |
https://{domain}/api/v2/stats/active-users | GET | Pridobi število aktivnih uporabnikov |
https://{domain}/api/v2/stats/daily | GET | Pridobi dnevno statistiko |
https://{domain}/oauth/token | POST | Pridobi žeton za dostop |
Primeri kode
Inicializacija konektorja
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});Sinhronizacija uporabnikov z 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;}Sledenje dogodkov avtentikacije prek 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');});Segmentacija na osnovi vlog
// 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') }});Omejitve hitrosti
| Kategorija končnih točk | Omejitev | Opombe |
|---|---|---|
| Management API | 50 zahtevkov/s (Free) | Na najemnika |
| Management API | 100 zahtevkov/s (plačljivo) | Na najemnika |
| Authentication API | Različno | Glede na paket |
| Log Streams | V realnem času | Brez omejitve hitrosti dostave |
| Paginacija | Največ 50 elementov/stran | Uporabi parametra page in per_page |
Zahtevana paginacija
Auth0 Management API vrne največ 50 rezultatov na stran. Vedno implementiraj paginacijo z parametroma page in per_page. Vključi include_totals=true za pridobitev skupnega števila.
Odpravljanje težav
| Težava | Vzrok | Rešitev |
|---|---|---|
| 401 Unauthorized | Žeton je potekel | Zahtevaj nov M2M žeton (24-urno trajanje) |
| 403 Forbidden | Manjkajoči obsegi | Dodeli zahtevana dovoljenja M2M aplikaciji |
| Prazen seznam uporabnikov | Napaka v iskalni poizvedbi | Uporabi sintakso Lucene za iskalnik v3 |
| Manjkajo metapodatki | Metapodatki niso nastavljeni | Preveri user_metadata in app_metadata |
| Omejitev hitrosti 429 | Preveč zahtevkov | Implementiraj odlog s ponovnimi poskusi |
Način odpravljanja napak
connectors: auth0: debug: true log_level: verbose log_sync: trueNajboljše prakse
- Uporabi Log Streams – pretakanje dogodkov v realnem času namesto anketiranja Logs API
- Implementiraj paginacijo – vedno paginiraj poizvedbe po seznamu uporabnikov za velike najemnike
- Predpomni M2M žetone – ponovno uporabi žetone do skorajšnjega poteka (privzeto 24-urna življenjska doba)
- Uporabi iskalnik v3 – za učinkovito iskanje uporabnikov uporabi sintakso Lucene
- Sinhronizacija samo preverjenih uporabnikov – filtriraj po
email_verified:true, da se izogneš nepreverjenim stikom - Izkoristi metapodatke uporabnikov – za sinhronizacijo shrani atribute po meri v user_metadata Auth0
Varnost
- Machine-to-Machine OAuth – dodelitev poverilnic odjemalca za avtentikacijo strežnik-strežnik
- Obsegana dovoljenja – dodeli minimalne zahtevane obsege Management API
- Rotacija žetonov – M2M žetoni privzeto potečejo po 24 urah
- Avtentikacija Log Stream – za webhook končne točke uporabi preverjanje prinosnega žetona
- Izolacija najemnika – ločene konfiguracije na najemnika Auth0
- Šifrirani prenos – TLS 1.2+ za vse komunikacije API