Auth0 コネクタ

Tajo を介して Auth0 を Brevo に接続し、認証されたユーザープロファイルをマーケティング連絡先として同期し、認証イベントに基づく自動化をトリガーし、ID およびアクセス管理のインサイトで顧客データを強化します。

概要

プロパティ
プラットフォームAuth0(Okta 提供)
カテゴリID とアクセス(カスタム)
セットアップの複雑さ
公式統合いいえ
同期データユーザー、イベント、ロール、ID
認証方式マシン間 OAuth 2.0

機能

  • ユーザープロファイル同期 - Auth0 ユーザープロファイルを Brevo 連絡先に同期
  • 認証イベント - ログイン、サインアップ、パスワードリセット時に自動化をトリガー
  • ロールベースセグメンテーション - Auth0 のロールと権限に基づいて連絡先をセグメント
  • ソーシャル ID データ - ソーシャルログインのプロファイル情報で連絡先を強化
  • ログインアクティビティトラッキング - 最終ログイン、ログイン回数、デバイスデータをトラッキング
  • マルチテナントサポート - 複数の Auth0 テナント間でユーザーを同期

前提条件

開始する前に、以下を準備してください。

  1. API アクセス可能な Auth0 アカウント
  2. Auth0 に登録済みのマシン間アプリケーション
  3. M2M アプリケーションに付与された Management API 権限
  4. API アクセス可能な Brevo アカウント
  5. コネクタ権限を持つ Tajo アカウント

認証

マシン間 OAuth 2.0

Terminal window
# Auth0 ダッシュボードで M2M アプリケーションを作成
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/
// Management API アクセストークンを取得
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();
// トークンはデフォルトで 24 時間有効

API 権限

M2M アプリケーションには必要なスコープのみを付与してください: read:usersread:user_idp_tokensread:rolesread: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 * * *" # 4 時間ごと
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 に同期

// Auth0 ユーザーをページネーションで取得
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 で認証イベントをトラッキング

// Auth0 Log Stream Webhook を設定
// Auth0 ダッシュボード > Monitoring > Streams で設定
app.post('/webhooks/auth0', async (req, res) => {
// 認可ヘッダーを検証
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': // ログイン成功
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': // サインアップ成功
await tajo.contacts.sync({
email: log.data.details.email,
attributes: { SIGNUP_DATE: log.data.date },
listIds: [20]
});
break;
case 'sp': // パスワード変更成功
await tajo.events.track({
email: log.data.details.email,
event: 'password_changed'
});
break;
}
}
res.status(200).send('OK');
});

ロールベースセグメンテーション

// セグメンテーションのためにユーザーロールを同期
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 req/秒(無料)テナント単位
Management API100 req/秒(有料)テナント単位
Authentication API変動プランに依存
Log Streamsリアルタイム配信にレート制限なし
ページネーション最大 50 アイテム/ページpageper_page パラメータを使用

ページネーションが必要

Auth0 Management API は 1 ページあたり最大 50 件の結果を返します。常に pageper_page パラメータを使用してページネーションを実装してください。合計件数を取得するには include_totals=true を含めます。

トラブルシューティング

問題原因解決策
401 Unauthorizedトークン期限切れ新しい M2M トークンをリクエスト(24 時間有効)
403 Forbiddenスコープの欠落M2M アプリに必要な権限を付与
ユーザーリストが空検索クエリエラーv3 エンジンには Lucene クエリ構文を使用
メタデータの欠落メタデータが未設定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 に保存

セキュリティ

  • マシン間 OAuth - サーバー間認証用のクライアント資格情報グラント
  • スコープ付き権限 - 最小限の必要な Management API スコープを付与
  • トークンローテーション - M2M トークンはデフォルトで 24 時間後に期限切れ
  • Log Stream 認証 - Webhook エンドポイントにベアラートークン検証を使用
  • テナント分離 - Auth0 テナントごとに個別の設定
  • 暗号化された通信 - すべての API 通信に TLS 1.2 以上

関連リソース

Subscribe to updates

developer-docs

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

auto-detect
AIアシスタント

こんにちは!ドキュメントについて何でもお聞きください。