Auth0 Connector

เชื่อมต่อ Auth0 กับ Brevo ผ่าน Tajo เพื่อซิงค์โปรไฟล์ผู้ใช้ที่ยืนยันตัวตนแล้วเป็นผู้ติดต่อทางการตลาด ทริกเกอร์ระบบอัตโนมัติตามเหตุการณ์การยืนยันตัวตน และเพิ่มความสมบูรณ์ให้ข้อมูลลูกค้าของคุณด้วยข้อมูลเชิงลึกจากการจัดการตัวตนและการเข้าถึง

ภาพรวม

คุณสมบัติค่า
แพลตฟอร์มAuth0 (by Okta)
หมวดหมู่Identity & Access (แบบกำหนดเอง)
ความซับซ้อนในการตั้งค่าปานกลาง
การผสานรวมอย่างเป็นทางการไม่
ข้อมูลที่ซิงค์ผู้ใช้ เหตุการณ์ บทบาท ตัวตน
วิธีการยืนยันตัวตนMachine-to-Machine OAuth 2.0

ฟีเจอร์

  • การซิงค์โปรไฟล์ผู้ใช้ - ซิงค์โปรไฟล์ผู้ใช้ Auth0 กับผู้ติดต่อ Brevo
  • เหตุการณ์การยืนยันตัวตน - ทริกเกอร์ระบบอัตโนมัติเมื่อเข้าสู่ระบบ สมัครสมาชิก และรีเซ็ตรหัสผ่าน
  • การแบ่งกลุ่มตามบทบาท - แบ่งกลุ่มผู้ติดต่อตามบทบาทและสิทธิ์ Auth0
  • ข้อมูลตัวตนจากโซเชียล - เพิ่มความสมบูรณ์ให้ผู้ติดต่อด้วยข้อมูลโปรไฟล์การเข้าสู่ระบบโซเชียล
  • การติดตามกิจกรรมการเข้าสู่ระบบ - ติดตามการเข้าสู่ระบบล่าสุด จำนวนการเข้าสู่ระบบ และข้อมูลอุปกรณ์
  • รองรับ multi-tenant - ซิงค์ผู้ใช้ข้าม Auth0 tenants หลายรายการ

ข้อกำหนดเบื้องต้น

ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:

  1. บัญชี Auth0 ที่มีสิทธิ์เข้าถึง API
  2. แอปพลิเคชัน Machine-to-Machine ที่ลงทะเบียนใน Auth0
  3. สิทธิ์ Management API ที่ให้กับแอปพลิเคชัน M2M
  4. บัญชี Brevo ที่มีสิทธิ์เข้าถึง API
  5. บัญชี Tajo ที่มีสิทธิ์ connector

การยืนยันตัวตน

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

ให้สิทธิ์เฉพาะ scopes ที่จำเป็นกับแอปพลิเคชัน 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 Endpoints

Endpointเมธอดคำอธิบาย
https://{domain}/api/v2/usersGETแสดงรายการหรือค้นหาผู้ใช้
https://{domain}/api/v2/users/{id}GETดูผู้ใช้
https://{domain}/api/v2/users/{id}PATCHอัปเดต user metadata
https://{domain}/api/v2/users/{id}/rolesGETดูบทบาทผู้ใช้
https://{domain}/api/v2/rolesGETแสดงรายการบทบาททั้งหมด
https://{domain}/api/v2/logsGETดูเหตุการณ์ log
https://{domain}/api/v2/stats/active-usersGETดูจำนวนผู้ใช้ที่ใช้งานอยู่
https://{domain}/api/v2/stats/dailyGETดูสถิติรายวัน
https://{domain}/oauth/tokenPOSTดู access token

ตัวอย่างโค้ด

เริ่มต้น Connector

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

ขีดจำกัดอัตรา

หมวดหมู่ Endpointขีดจำกัดหมายเหตุ
Management API50 req/วินาที (Free)ต่อ tenant
Management API100 req/วินาที (Paid)ต่อ tenant
Authentication APIแตกต่างกันขึ้นอยู่กับแผน
Log Streamsแบบเรียลไทม์ไม่มีขีดจำกัดอัตราในการส่ง
Paginationสูงสุด 50 รายการ/หน้าใช้พารามิเตอร์ page และ per_page

ต้องใช้ Pagination

Auth0 Management API ส่งคืนสูงสุด 50 ผลลัพธ์ต่อหน้า ต้องใช้ pagination เสมอโดยใช้พารามิเตอร์ page และ per_page รวม include_totals=true เพื่อดูจำนวนทั้งหมด

การแก้ไขปัญหา

ปัญหาสาเหตุวิธีแก้
401 UnauthorizedToken หมดอายุขอ M2M token ใหม่ (หมดอายุ 24 ชั่วโมง)
403 ForbiddenScopes หายไปให้สิทธิ์ที่จำเป็นกับแอปพลิเคชัน M2M
รายการผู้ใช้ว่างเปล่าข้อผิดพลาด search queryใช้ Lucene query syntax สำหรับ v3 engine
Metadata หายไปMetadata ไม่ได้ตั้งค่าตรวจสอบ user_metadata และ app_metadata
ขีดจำกัดอัตรา 429คำขอมากเกินไปใช้ backoff พร้อม retry headers

โหมด Debug

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

แนวทางปฏิบัติที่ดีที่สุด

  1. ใช้ Log Streams - การสตรีมเหตุการณ์แบบเรียลไทม์แทนการ polling Logs API
  2. ใช้ pagination - ต้อง paginate คำถาม user list เสมอสำหรับ tenants ขนาดใหญ่
  3. Cache M2M tokens - ใช้ tokens ซ้ำจนใกล้หมดอายุ (อายุการใช้งานเริ่มต้น 24 ชั่วโมง)
  4. ใช้ search engine v3 - ใช้ Lucene query syntax สำหรับการค้นหาผู้ใช้ที่มีประสิทธิภาพ
  5. ซิงค์เฉพาะผู้ใช้ที่ยืนยันแล้ว - กรองด้วย email_verified:true เพื่อหลีกเลี่ยงผู้ติดต่อที่ยังไม่ยืนยัน
  6. ใช้ประโยชน์จาก user metadata - จัดเก็บแอตทริบิวต์แบบกำหนดเองใน Auth0 user_metadata สำหรับการซิงค์

ความปลอดภัย

  • Machine-to-Machine OAuth - Client credentials grant สำหรับการยืนยันตัวตนระหว่างเซิร์ฟเวอร์
  • สิทธิ์แบบกำหนดขอบเขต - ให้ scopes Management API ขั้นต่ำที่จำเป็น
  • การหมุนเวียน Token - M2M tokens หมดอายุหลังจาก 24 ชั่วโมงตามค่าเริ่มต้น
  • การยืนยันตัวตน Log Stream - ใช้การตรวจสอบ bearer token สำหรับ webhook endpoints
  • การแยก Tenant - การกำหนดค่าแยกต่างหากต่อ Auth0 tenant
  • การส่งข้อมูลที่เข้ารหัส - 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

สวัสดี! ถามฉันเกี่ยวกับเอกสารได้เลย