Tajo 사전 이용 신청

이름과 이메일 주소 또는 전화번호를 입력해 주세요. Tajo 이용 방법을 안내해 드립니다.

Auth0 커넥터

Tajo를 통해 Auth0를 Brevo에 연결하여 인증된 사용자 프로필을 마케팅 연락처로 동기화하고, 인증 이벤트 기반의 자동화를 트리거하며, 신원 및 액세스 관리 인사이트로 고객 데이터를 풍부하게 만드세요.

개요

속성
플랫폼Auth0 (by Okta)
카테고리Identity & Access (Custom)
설정 난이도보통
공식 통합아니오
동기화되는 데이터사용자, 이벤트, 역할, 신원
인증 방식Machine-to-Machine OAuth 2.0

주요 기능

  • 사용자 프로필 동기화 - Auth0 사용자 프로필을 Brevo 연락처에 동기화합니다
  • 인증 이벤트 - 로그인, 가입, 비밀번호 재설정 시 자동화를 트리거합니다
  • 역할 기반 세분화 - Auth0 역할 및 권한을 기반으로 연락처를 세분화합니다
  • 소셜 신원 데이터 - 소셜 로그인 프로필 정보로 연락처를 풍부하게 만듭니다
  • 로그인 활동 추적 - 마지막 로그인, 로그인 횟수, 디바이스 데이터를 추적합니다
  • 멀티 테넌트 지원 - 여러 Auth0 테넌트의 사용자를 동기화합니다

사전 준비 사항

시작하기 전에 다음 사항이 준비되어 있어야 합니다.

  1. API 액세스가 있는 Auth0 계정
  2. Auth0에 등록된 Machine-to-Machine 애플리케이션
  3. M2M 애플리케이션에 부여된 Management API 권한
  4. API 액세스가 활성화된 Brevo 계정
  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. 필요하지 않은 경우 write 권한 부여는 피하세요.

설정

기본 설정

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 엔드포인트

엔드포인트Method설명
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 API초당 50회 (Free)테넌트당
Management API초당 100회 (Paid)테넌트당
Authentication API다양플랜에 따라 다름
Log Streams실시간전송에 요청 제한 없음
페이지네이션페이지당 최대 50개 항목pageper_page 파라미터 사용

페이지네이션 필수

Auth0 Management API는 페이지당 최대 50개의 결과를 반환합니다. 항상 pageper_page 파라미터를 사용해 페이지네이션을 구현하세요. 전체 개수를 얻으려면 include_totals=true를 포함하세요.

문제 해결

문제원인해결 방법
401 Unauthorized토큰 만료새 M2M 토큰 요청 (24시간 만료)
403 Forbidden스코프 누락M2M 앱에 필요한 권한을 부여하세요
빈 사용자 목록검색 쿼리 오류v3 엔진용 Lucene 쿼리 구문을 사용하세요
메타데이터 누락메타데이터가 설정되지 않음user_metadata와 app_metadata를 확인하세요
Rate limit 429요청이 너무 많음retry 헤더를 사용해 백오프를 구현하세요

디버그 모드

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 grant
  • 스코프 기반 권한 - 최소한의 필요한 Management API 스코프를 부여하세요
  • 토큰 순환 - M2M 토큰은 기본적으로 24시간 후 만료됩니다
  • Log Stream 인증 - 웹훅 엔드포인트에 대해 bearer 토큰 검증을 사용하세요
  • 테넌트 격리 - Auth0 테넌트별로 구성을 분리하세요
  • 암호화된 전송 - 모든 API 통신에 TLS 1.2+ 사용

관련 리소스

Tajo 사전 이용 신청

이름과 이메일 주소 또는 전화번호를 입력해 주세요. Tajo 이용 방법을 안내해 드립니다.

자동 감지
AI 어시스턴트

안녕하세요! 문서에 대해 무엇이든 물어보세요.