Firebase Authentication トリガー

Firebase Authentication ユーザー アカウントの作成と削除に対応して関数をトリガーできます。たとえば、アプリでアカウントを作成したばかりのユーザーに登録完了の通知メールを送信できます。このページの例は、アカウントの作成時と削除時に登録完了と削除完了の通知メールを送信するサンプルに基づいています。

その他の使用例については、Cloud Functions で可能な処理をご覧ください。

ユーザー作成時に関数をトリガーする

firebase-functions/v2/identity サブパッケージの onUserCreated イベント ハンドラを使用して、Authentication ユーザーの作成時にトリガーされる関数を作成できます。

const { onUserCreated } = require("firebase-functions/identity");
const { defineSecret } = require("firebase-functions/params");
const { logger } = require("firebase-functions");
const { sendWelcomeEmail } = require("./utils/myEmailService");

const emailApiKey = defineSecret("EMAIL_API_KEY");

exports.newUserWelcome = onUserCreated(
  { secrets: [emailApiKey] },
  async (event) => {
    const { uid, email, displayName } = event.data;

    if (!email) {
      logger.log(`User ${uid} does not have an email address.`);
      return;
    }

    await sendWelcomeEmail(email, displayName);
  },
);

Authentication アカウントでは、以下の場合に Cloud Functions のユーザー作成イベントがトリガーされます。

  • ユーザーがメール アカウントとパスワードを作成したとき。
  • ユーザーがフェデレーション ID プロバイダを使用して初めてログインしたとき。
  • 開発者が Admin SDK を使用してアカウントを作成したとき。
  • ユーザーが新しい匿名 Auth セッションに初めてログインしたとき。

ユーザーがカスタム トークンを使用して初めてログインするときには、Cloud Functions イベントはトリガーされません

トリガー オプションとマルチテナンシーを構成する

関数を構成するには、オプション オブジェクト(AuthOptions)を onUserCreated の最初のパラメータとして渡します。

/**
 * Sends a welcome email scoped to a specific tenant in Identity Platform.
 */
exports.sendWelcomeEmailToTenant = onUserCreated(
  {
    secrets: [emailApiKey],
    // Only trigger when a user is a member of this tenant
    tenantId: "my-tenant-id",
  },
  async (event) => {
    const { uid, email, displayName } = event.data;
    // Customize the email for this tenant
    await sendWelcomeEmail(email, displayName, event.tenantId);
  },
);
  /**
 * Sends a welcome email only to users not associated with any tenant.
 */
exports.sendWelcomeEmailNoTenant = onUserCreated(
  {
    secrets: [emailApiKey],
    // Only trigger when a user is NOT a member of a tenant
    tenantId: IS_NOT_TENANT,
  },
  async (event) => {
    const { email, displayName } = event.data;

    // Send a generic welcome email
    await sendWelcomeEmail(email, displayName);
  },
);

プロジェクトで Identity Platform マルチテナンシーを使用している場合は、トリガーのスコープを設定できます。

  • デフォルト プロジェクト(テナントなし): デフォルト プロジェクトで作成されたユーザーのみをリッスンするように tenantIdIS_NOT_TENANT に設定します。
  • 特定のテナント: テナントの文字列 ID({ tenantId: "tenant-id-1" } など)を指定して、そのテナントで作成されたユーザーのみをリッスンします。
  • すべてのテナントとユーザー: tenantId が省略されている場合、関数はプロジェクト内のすべてのテナントとデフォルト プロジェクト ユーザーのユーザー作成イベントでトリガーされます。

tenantId に加えて、regionconcurrencycpumemorytimeoutSecondsminInstancesmaxInstancessecrets などの標準の第 2 世代構成オプションを指定できます。

ユーザー属性にアクセスする

関数に返されたユーザーデータから、event.data を介して、新しく作成されたユーザーの UserRecord オブジェクトで使用可能なユーザー属性のリストにアクセスできます。たとえば、次に示すように、ユーザーのメールと表示名を取得できます。

const { uid, email, displayName } = event.data;

第 2 世代の認証トリガーは AuthEvent オブジェクトを受け取ります。event.data に加えて、次のようなイベント メタデータにアクセスできます。

  • event.id: イベントの固有識別子。
  • event.type: イベントタイプ(google.firebase.auth.user.v2.created)。
  • event.time: イベントが発生した日時を表す ISO 8601 タイムスタンプ。
  • event.project: Google Cloud プロジェクト ID。
  • event.tenantId: 該当する場合、ユーザーに関連付けられた Identity Platform テナント ID。

ユーザー削除時に関数をトリガーする

ユーザー作成時に関数をトリガーできるのと同様に、ユーザー削除イベントに対応できます。次のように、firebase-functions/v2/identityonUserDeleted イベント ハンドラを使用します。

const { onUserDeleted } = require("firebase-functions/identity");
const { defineSecret } = require("firebase-functions/params");
const { logger } = require("firebase-functions");
const { sendGoodbyeEmail } = require("./utils/myEmailService");

const emailApiKey = defineSecret("EMAIL_API_KEY");

exports.deletedUserFarewell = onUserDeleted(
  { secrets: [emailApiKey] },
  async (event) => {
    const { uid, email, displayName } = event.data;
    if (!email) {
      logger.log(`User ${uid} does not have an email address.`);
      return;
    }

    await sendGoodbyeEmail(email, displayName);
  },
);

onUserCreated と同様に、onUserDeleted{ tenantId: IS_NOT_TENANT } などのオプションで構成して、トリガーをデフォルト プロジェクトのユーザーに制限できます。

ブロッキング関数をトリガーする

Firebase Authentication with Identity Platform にアップグレードした場合は、ブロッキング関数を使用して Firebase Authentication を拡張できます。

ブロッキング関数を使用すると、アプリの登録やログインの結果を変更するカスタムコードを同期的に実行できます。イベントの終了後に非同期で実行されるバックグラウンド トリガーとは異なり、ブロッキング関数を使用すると、ユーザーが特定の条件を満たしていない場合にユーザーが認証されないようにすることや、クライアント アプリに戻る前にユーザーの情報とクレームを更新することができます。

第 2 世代のトリガーのベスト プラクティス

第 2 世代の認証トリガーを実装する際は、次のベスト プラクティスを念頭に置いてください。

  • 同時実行を考慮する: Cloud Functions(第 2 世代)インスタンスは、同時リクエストを処理します(CPU ≥ 1 の場合、デフォルトは 80 の同時リクエスト)。関数が、同時実行間でグローバルな変更可能な状態に依存していないことを確認します。
  • べき等性を考慮した設計: 第 2 世代のイベント配信は、Eventarc 経由で少なくとも 1 回行われます。関数がべき等であることを確認します。たとえば、副作用を実行する前に、ウェルカム メールがすでに送信されていないことや、データベース エントリが初期化されていないことを確認します。
  • マルチテナント関数のスコープを設定する: アプリケーションで Identity Platform マルチテナンシーを使用している場合は、関数がすべてのテナントまたは特定のテナントのイベントを処理する必要があるかどうかを確認します。tenantId: IS_NOT_TENANT を使用して、テナント ユーザーがプライマリ プロジェクト専用の関数をトリガーできないようにします。
  • リージョンとリソース割り当てを管理する: 認証プロバイダと関数実行環境間のネットワーク レイテンシを最小限に抑えるために、関数ロケーション(region)を指定します。