Auth0 コネクタ
Tajo を介して Auth0 を Brevo に接続し、認証されたユーザープロファイルをマーケティング連絡先として同期し、認証イベントに基づく自動化をトリガーし、ID およびアクセス管理のインサイトで顧客データを強化します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | Auth0(Okta 提供) |
| カテゴリ | ID とアクセス(カスタム) |
| セットアップの複雑さ | 中 |
| 公式統合 | いいえ |
| 同期データ | ユーザー、イベント、ロール、ID |
| 認証方式 | マシン間 OAuth 2.0 |
機能
- ユーザープロファイル同期 - Auth0 ユーザープロファイルを Brevo 連絡先に同期
- 認証イベント - ログイン、サインアップ、パスワードリセット時に自動化をトリガー
- ロールベースセグメンテーション - Auth0 のロールと権限に基づいて連絡先をセグメント
- ソーシャル ID データ - ソーシャルログインのプロファイル情報で連絡先を強化
- ログインアクティビティトラッキング - 最終ログイン、ログイン回数、デバイスデータをトラッキング
- マルチテナントサポート - 複数の Auth0 テナント間でユーザーを同期
前提条件
開始する前に、以下を準備してください。
- API アクセス可能な Auth0 アカウント
- Auth0 に登録済みのマシン間アプリケーション
- M2M アプリケーションに付与された Management API 権限
- API アクセス可能な Brevo アカウント
- コネクタ権限を持つ Tajo アカウント
認証
マシン間 OAuth 2.0
# Auth0 ダッシュボードで M2M アプリケーションを作成export 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/// 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: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 * * *" # 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_ROLEAPI エンドポイント
| エンドポイント | メソッド | 説明 |
|---|---|---|
https://{domain}/api/v2/users | GET | ユーザーを一覧または検索 |
https://{domain}/api/v2/users/{id} | GET | ユーザーを取得 |
https://{domain}/api/v2/users/{id} | PATCH | ユーザーメタデータを更新 |
https://{domain}/api/v2/users/{id}/roles | GET | ユーザーのロールを取得 |
https://{domain}/api/v2/roles | GET | すべてのロールを一覧取得 |
https://{domain}/api/v2/logs | GET | ログイベントを取得 |
https://{domain}/api/v2/stats/active-users | GET | アクティブユーザー数を取得 |
https://{domain}/api/v2/stats/daily | GET | 日次統計を取得 |
https://{domain}/oauth/token | POST | アクセストークンを取得 |
コード例
コネクタの初期化
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 API | 50 req/秒(無料) | テナント単位 |
| Management API | 100 req/秒(有料) | テナント単位 |
| Authentication API | 変動 | プランに依存 |
| Log Streams | リアルタイム | 配信にレート制限なし |
| ページネーション | 最大 50 アイテム/ページ | page と per_page パラメータを使用 |
ページネーションが必要
Auth0 Management API は 1 ページあたり最大 50 件の結果を返します。常に page と per_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ベストプラクティス
- Log Streams を使用する - Logs API のポーリングではなく、リアルタイムイベントストリーミングを使用
- ページネーションを実装する - 大規模テナントでは常にユーザーリストクエリをページネーション
- M2M トークンをキャッシュする - 有効期限近くまでトークンを再利用(デフォルト 24 時間の有効期間)
- 検索エンジン v3 を使用する - 効率的なユーザー検索のために Lucene クエリ構文を使用
- 検証済みユーザーのみ同期する - 未検証連絡先を避けるため
email_verified:trueでフィルタ - ユーザーメタデータを活用する - 同期用のカスタム属性を Auth0 user_metadata に保存
セキュリティ
- マシン間 OAuth - サーバー間認証用のクライアント資格情報グラント
- スコープ付き権限 - 最小限の必要な Management API スコープを付与
- トークンローテーション - M2M トークンはデフォルトで 24 時間後に期限切れ
- Log Stream 認証 - Webhook エンドポイントにベアラートークン検証を使用
- テナント分離 - Auth0 テナントごとに個別の設定
- 暗号化された通信 - すべての API 通信に TLS 1.2 以上