Pemicu Firebase Authentication

Anda dapat memicu Cloud Functions sebagai respons terhadap pembuatan dan penghapusan akun pengguna Firebase Authentication. Misalnya, Anda dapat mengirim email sambutan kepada pengguna yang baru saja membuat akun di aplikasi Anda. Contoh di halaman ini didasarkan pada contoh fungsi yang melakukan hal tersebut, yaitu mengirimkan email sambutan saat akun dibuat dan email perpisahan saat akun dihapus.

Untuk mengetahui contoh kasus penggunaan lainnya, baca Apa yang dapat dilakukan dengan Cloud Functions?.

Memicu fungsi pada pembuatan pengguna

Anda dapat membuat fungsi yang dipicu saat pengguna Authentication dibuat menggunakan pengendali peristiwa onUserCreated dari subpaket firebase-functions/v2/identity:

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

Akun Authentication akan memicu peristiwa pembuatan pengguna untuk Cloud Functions saat:

  • Pengguna membuat akun email dan sandi.
  • Pengguna login untuk pertama kalinya menggunakan penyedia identitas gabungan.
  • Developer membuat akun menggunakan Admin SDK.
  • Pengguna login ke sesi autentikasi anonim baru untuk pertama kalinya.

Peristiwa Cloud Functions tidak dipicu ketika pengguna login untuk pertama kali menggunakan token kustom.

Mengonfigurasi opsi pemicu dan multi-tenancy

Anda dapat mengonfigurasi fungsi dengan meneruskan objek opsi (AuthOptions) sebagai parameter pertama ke 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);
  },
);

Jika project Anda menggunakan multi-tenancy Identity Platform, Anda dapat mencakup pemicu:

  • Project default (tanpa tenant): Tetapkan tenantId ke IS_NOT_TENANT untuk memproses hanya pengguna yang dibuat di project default.
  • Tenant tertentu: Berikan ID string tenant (misalnya, { tenantId: "tenant-id-1" }) untuk hanya memproses pengguna yang dibuat di tenant tersebut.
  • Semua tenant dan pengguna: Jika tenantId tidak disertakan, fungsi akan dipicu pada peristiwa pembuatan pengguna di semua tenant dan pengguna project default dalam project.

Selain tenantId, Anda dapat menentukan opsi konfigurasi standar generasi ke-2, termasuk region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances, dan secrets.

Mengakses atribut pengguna

Dari data pengguna yang ditampilkan ke fungsi, Anda dapat mengakses daftar atribut pengguna yang tersedia di objek UserRecord pengguna yang baru dibuat melalui event.data. Misalnya, Anda dapat memperoleh email dan nama tampilan pengguna, seperti ditunjukkan berikut ini:

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

Pemicu autentikasi di generasi ke-2 menerima objek AuthEvent. Selain event.data, Anda dapat mengakses metadata peristiwa seperti:

  • event.id: ID unik untuk peristiwa.
  • event.type: Jenis peristiwa (google.firebase.auth.user.v2.created).
  • event.time: Stempel waktu ISO 8601 yang menunjukkan kapan peristiwa terjadi.
  • event.project: Project ID Google Cloud.
  • event.tenantId: ID tenant Identity Platform yang terkait dengan pengguna, jika ada.

Memicu fungsi pada saat penghapusan pengguna

Seperti halnya Anda dapat memicu fungsi pada saat pembuatan pengguna, Anda dapat merespons peristiwa penghapusan pengguna. Gunakan pengendali peristiwa onUserDeleted dari firebase-functions/v2/identity seperti yang ditunjukkan:

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

Seperti onUserCreated, Anda dapat mengonfigurasi onUserDeleted dengan opsi seperti { tenantId: IS_NOT_TENANT } untuk membatasi pemicu bagi pengguna di project default.

Memicu fungsi pemblokiran

Jika telah mengupgrade ke Firebase Authentication with Identity Platform, Anda dapat memperluas Firebase Authentication menggunakan fungsi pemblokiran.

Fungsi pemblokiran memungkinkan Anda mengeksekusi kode kustom secara serentak yang mengubah hasil pendaftaran atau login pengguna ke aplikasi Anda. Tidak seperti pemicu latar belakang, yang berjalan secara asinkron setelah suatu peristiwa selesai, fungsi pemblokiran memungkinkan Anda mencegah pengguna melakukan autentikasi jika tidak memenuhi kriteria tertentu, atau memperbarui informasi dan klaim pengguna sebelum menampilkannya ke aplikasi klien.

Praktik terbaik untuk pemicu generasi ke-2

Saat menerapkan pemicu autentikasi generasi ke-2, perhatikan praktik terbaik berikut:

  • Memperhitungkan konkurensi: Instance Cloud Functions (generasi ke-2) memproses permintaan serentak (secara default hingga 80 permintaan serentak jika CPU ≥ 1). Pastikan fungsi Anda tidak bergantung pada status global yang dapat berubah di antara eksekusi serentak.
  • Desain untuk idempoten: Pengiriman peristiwa di generasi ke-2 dilakukan setidaknya sekali melalui Eventarc. Pastikan fungsi Anda bersifat idempoten; misalnya, verifikasi bahwa email selamat datang belum dikirim atau entri database belum diinisialisasi sebelum melakukan efek samping.
  • Cakupan fungsi multi-tenant: Jika aplikasi Anda menggunakan multi-tenancy Identity Platform, verifikasi apakah fungsi Anda harus menangani peristiwa di semua tenant atau hanya tenant tertentu. Gunakan tenantId: IS_NOT_TENANT untuk mencegah pengguna tenant memicu fungsi yang hanya ditujukan untuk project utama.
  • Mengelola region dan alokasi resource: Tentukan lokasi fungsi (region) untuk meminimalkan latensi jaringan antara penyedia autentikasi dan lingkungan eksekusi fungsi Anda.