Aktywatory uwierzytelniania Firebase

Możesz wywoływać funkcje w odpowiedzi na tworzenie i usuwanie Firebase Authentication kont użytkowników. Możesz na przykład wysłać e-maila powitalnego do użytkownika, który właśnie utworzył konto w Twojej aplikacji. Przykłady na tej stronie są oparte na próbce, która właśnie to robi – wysyła e-maile powitalne i pożegnalne po utworzeniu i usunięciu konta.

Więcej przykładów zastosowań znajdziesz w artykule Co mogę zrobić za pomocą Cloud Functions?.

Aktywowanie funkcji podczas tworzenia użytkownika

Możesz utworzyć funkcję, która uruchamia się, gdy Authentication użytkownik zostanie utworzony za pomocą procedury obsługi zdarzeń onUserCreated z pakietu podrzędnego 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);
  },
);

Konta Authentication będą wywoływać zdarzenia tworzenia użytkowników w Cloud Functions, gdy:

  • Użytkownik tworzy konto e-mail i hasło.
  • Użytkownik loguje się po raz pierwszy przy użyciu sfederowanego dostawcy tożsamości.
  • Deweloper tworzy konto za pomocą pakietu Admin SDK.
  • Użytkownik loguje się po raz pierwszy w nowej anonimowej sesji uwierzytelniania.

Zdarzenie Cloud Functions nie jest wywoływane, gdy użytkownik loguje się po raz pierwszy za pomocą niestandardowego tokena.

Konfigurowanie opcji reguł i środowiska wielu najemców

Funkcję możesz skonfigurować, przekazując obiekt opcji (AuthOptions) jako pierwszy parametr do 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);
  },
);

Jeśli Twój projekt korzysta ze środowiska wielu najemców w usłudze Identity Platform, możesz określić zakres wyzwalacza:

  • Projekt domyślny (bez najemcy): ustaw wartość tenantId na IS_NOT_TENANT, aby nasłuchiwać tylko użytkowników utworzonych w projekcie domyślnym.
  • Konkretny najemca: podaj identyfikator najemcy w postaci ciągu znaków (np.{ tenantId: "tenant-id-1" }), aby nasłuchiwać tylko użytkowników utworzonych w tym najemcy.
  • Wszyscy najemcy i użytkownicy: jeśli symbol tenantId zostanie pominięty, funkcja zostanie wywołana w przypadku zdarzeń tworzenia użytkowników we wszystkich najemcach i użytkowników projektu domyślnego w projekcie.

Oprócz tenantId możesz określić standardowe opcje konfiguracji 2 generacji, w tym region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances i secrets.

Dostęp do atrybutów użytkownika

Z danych użytkownika zwróconych do funkcji możesz uzyskać dostęp do listy atrybutów użytkownika dostępnych w obiekcie UserRecord nowo utworzonego użytkownika za pomocą event.data. Możesz na przykład uzyskać adres e-mail i nazwę wyświetlaną użytkownika, jak pokazano poniżej:

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

Triggery uwierzytelniania w 2 generacji otrzymują obiekt AuthEvent. Oprócz event.data możesz uzyskać dostęp do metadanych zdarzenia, takich jak:

  • event.id: unikalny identyfikator zdarzenia.
  • event.type: typ zdarzenia (google.firebase.auth.user.v2.created).
  • event.time: sygnatura czasowa w formacie ISO 8601 reprezentująca moment wystąpienia zdarzenia.
  • event.project: identyfikator projektu w chmurze Google.
  • event.tenantId: identyfikator najemcy Identity Platform powiązany z użytkownikiem, jeśli ma to zastosowanie.

Aktywowanie funkcji po usunięciu użytkownika

Podobnie jak w przypadku tworzenia użytkownika, możesz wywołać funkcję w odpowiedzi na zdarzenia usunięcia użytkownika. Użyj modułu obsługi zdarzeń onUserDeleted z firebase-functions/v2/identity w sposób pokazany poniżej:

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

Podobnie jak w przypadku onUserCreated, możesz skonfigurować onUserDeleted za pomocą opcji takich jak { tenantId: IS_NOT_TENANT }, aby ograniczyć reguły do użytkowników w domyślnym projekcie.

Aktywowanie funkcji blokujących

Jeśli korzystasz z wersji Firebase Authentication with Identity Platform, możesz rozszerzyć Firebase Authentication za pomocą funkcji blokujących.

Funkcje blokujące umożliwiają synchroniczne wykonywanie kodu niestandardowego, który modyfikuje wynik rejestracji lub logowania użytkownika w aplikacji. W przeciwieństwie do wyzwalaczy działających w tle, które są uruchamiane asynchronicznie po zakończeniu zdarzenia, funkcje blokujące umożliwiają uniemożliwienie użytkownikowi uwierzytelnienia, jeśli nie spełnia on określonych kryteriów, lub aktualizowanie informacji i deklaracji użytkownika przed zwróceniem ich do aplikacji klienta.

Sprawdzone metody dotyczące reguł 2 generacji

Podczas wdrażania wyzwalaczy uwierzytelniania 2 generacji pamiętaj o tych sprawdzonych metodach:

  • Uwzględnij równoczesność: instancje Cloud Functions (2 generacji) przetwarzają żądania równoczesne (domyślnie 80 żądania równoczesne, gdy liczba procesorów ≥ 1). Sprawdź, czy funkcja nie korzysta z globalnego stanu modyfikowalnego między współbieżnymi wykonaniami.
  • Zaprojektuj pod kątem idempotentności: dostarczanie zdarzeń w usłudze Cloud Functions – 2 generacji odbywa się co najmniej raz za pomocą usługi Eventarc. Upewnij się, że Twoje funkcje są idempotentne. Na przykład przed wykonaniem efektów ubocznych sprawdź, czy e-mail powitalny nie został już wysłany lub czy wpis w bazie danych nie został zainicjowany.
  • Określ zakres funkcji dla wielu najemców: jeśli Twoja aplikacja korzysta z funkcji wielu najemców Identity Platform, sprawdź, czy funkcje powinny obsługiwać zdarzenia we wszystkich najemcach, czy tylko w określonych. Użyj tenantId: IS_NOT_TENANT, aby uniemożliwić użytkownikom najemcy wywoływanie funkcji przeznaczonych tylko dla projektu głównego.
  • Zarządzanie regionami i przydzielaniem zasobów: określ lokalizację funkcji (region), aby zminimalizować opóźnienie sieci między dostawcą uwierzytelniania a środowiskiem wykonawczym funkcji.