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ść
tenantIdnaIS_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
tenantIdzostanie 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.