موصل Auth0

اربط Auth0 بـ Brevo عبر Tajo لمزامنة ملفات المستخدمين المُصادق عليهم كجهات اتصال تسويقية، وتشغيل الأتمتة بناءً على أحداث المصادقة، وإثراء بيانات عملائك برؤى إدارة الهوية والوصول.

نظرة عامة

الخاصيةالقيمة
المنصةAuth0 (by Okta)
الفئةالهوية والوصول (مخصص)
تعقيد الإعدادمتوسط
تكامل رسميلا
البيانات المتزامنةالمستخدمون، الأحداث، الأدوار، الهويات
طريقة المصادقةMachine-to-Machine OAuth 2.0

الميزات

  • مزامنة ملف المستخدم - زامن ملفات مستخدم Auth0 إلى جهات اتصال Brevo
  • أحداث المصادقة - شغّل الأتمتة عند تسجيل الدخول، والتسجيل، وإعادة تعيين كلمة المرور
  • تقسيم قائم على الأدوار - قسّم جهات الاتصال بناءً على أدوار وأذونات Auth0
  • بيانات الهوية الاجتماعية - أثرِ جهات الاتصال بمعلومات ملف تسجيل الدخول الاجتماعي
  • تتبع نشاط تسجيل الدخول - تتبع آخر تسجيل دخول، وعدد التسجيلات، وبيانات الجهاز
  • دعم متعدد المستأجرين - زامن المستخدمين عبر مستأجري Auth0 متعددين

المتطلبات المسبقة

قبل أن تبدأ، تأكد من توفر ما يلي:

  1. حساب Auth0 مع وصول API
  2. تطبيق Machine-to-Machine مسجل في Auth0
  3. أذونات Management API ممنوحة لتطبيق M2M
  4. حساب Brevo مع وصول API
  5. حساب Tajo مع أذونات الموصلات

المصادقة

Machine-to-Machine OAuth 2.0

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

أذونات API

امنح فقط النطاقات المطلوبة لتطبيق 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_ROLE

نقاط نهاية API

نقطة النهايةالطريقةالوصف
https://{domain}/api/v2/usersGETعرض أو البحث عن المستخدمين
https://{domain}/api/v2/users/{id}GETالحصول على مستخدم
https://{domain}/api/v2/users/{id}PATCHتحديث بيانات المستخدم
https://{domain}/api/v2/users/{id}/rolesGETالحصول على أدوار المستخدم
https://{domain}/api/v2/rolesGETعرض جميع الأدوار
https://{domain}/api/v2/logsGETالحصول على أحداث السجل
https://{domain}/api/v2/stats/active-usersGETالحصول على عدد المستخدمين النشطين
https://{domain}/api/v2/stats/dailyGETالحصول على الإحصائيات اليومية
https://{domain}/oauth/tokenPOSTالحصول على رمز الوصول

أمثلة البرمجة

تهيئة الموصل

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 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;
}

تتبع أحداث المصادقة عبر 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 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')
}
});

حدود المعدل

فئة نقطة النهايةالحدملاحظات
Management API50 طلب/ثانية (Free)لكل مستأجر
Management API100 طلب/ثانية (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
بيانات وصفية مفقودةالبيانات الوصفية غير مضبوطةتحقق من user_metadata و app_metadata
حد معدل 429عدد كبير من الطلباتنفّذ التراجع برؤوس إعادة المحاولة

وضع التصحيح

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

أفضل الممارسات

  1. استخدم Log Streams - بث أحداث في الوقت الفعلي بدلاً من استطلاع Logs API
  2. طبّق الترقيم - رقّم دائمًا استعلامات قائمة المستخدمين للمستأجرين الكبار
  3. احفظ رموز M2M مؤقتًا - أعد استخدام الرموز حتى قرب انتهاء الصلاحية (عمر افتراضي 24 ساعة)
  4. استخدم محرك البحث v3 - استخدم بنية استعلام Lucene لبحث مستخدم فعال
  5. زامن المستخدمين المُوَثَّقين فقط - صفِّ على email_verified:true لتجنب جهات الاتصال غير المُوَثَّقة
  6. استفد من البيانات الوصفية للمستخدم - خزّن السمات المخصصة في Auth0 user_metadata للمزامنة

الأمان

  • Machine-to-Machine OAuth - منح client credentials لمصادقة خادم إلى خادم
  • أذونات محددة النطاق - امنح الحد الأدنى من نطاقات Management API المطلوبة
  • تدوير الرمز - تنتهي صلاحية رموز M2M بعد 24 ساعة افتراضيًا
  • مصادقة Log Stream - استخدم التحقق من رمز bearer لنقاط نهاية webhook
  • عزل المستأجر - تكوينات منفصلة لكل مستأجر Auth0
  • النقل المشفر - TLS 1.2+ لجميع اتصالات API

موارد ذات صلة

Subscribe to updates

developer-docs

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

auto-detect
مساعد AI

مرحباً! اسألني أي شيء عن الوثائق.