Możesz aktywować funkcje w odpowiedzi na utworzenie i usunięcie kont użytkowników Firebase Authentication. 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 robi dokładnie to – wysyła e-maile powitalne i pożegnalne po utworzeniu i usunięciu konta.
Więcej przykładów przypadków użycia znajdziesz w artykule Co można zrobić za pomocą Cloud Functions?.
Aktywowanie funkcji przy tworzeniu użytkownika
Możesz utworzyć funkcję, która jest wywoływana, gdy użytkownik Authentication jest tworzony za pomocą modułu obsługi zdarzeń onUserCreated z podpakietu 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 dostawcy tożsamości sfederowanej.
- Deweloper tworzy konto za pomocą pakietu Admin SDK.
- Użytkownik po raz pierwszy loguje się w nowej anonimowej sesji uwierzytelniania.
Zdarzenie Cloud Functions nie jest wywoływane, gdy użytkownik loguje się po raz pierwszy za pomocą tokena niestandardowego.
Konfigurowanie opcji aktywatora 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 Identity Platform, możesz określić zakres aktywatora:
- Projekt domyślny (bez najemcy): ustaw
tenantIdnaIS_NOT_TENANT, aby nasłuchiwać tylko użytkowników utworzonych w projekcie domyślnym. - Określony 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 parametr
tenantIdzostanie pominięty, funkcja będzie aktywowana przez zdarzenia utworzenia użytkownika u wszystkich najemców i domyślnych użytkowników projektu.
Oprócz tenantId możesz określić standardowe opcje konfiguracji funkcji 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 wyświetlaną nazwę użytkownika, jak pokazano poniżej:
const { uid, email, displayName } = event.data;
Wyzwalacze uwierzytelniania w funkcjach 2 generacji otrzymują obiekt AuthEvent. Oprócz event.data możesz uzyskać dostęp do metadanych zdarzeń, takich jak:
event.id: unikalny identyfikator zdarzenia.event.type: typ zdarzenia (google.firebase.auth.user.v2.created).event.time: sygnatura czasowa ISO 8601 wskazująca, kiedy wystąpiło zdarzenie.event.project: identyfikator projektu w chmurze Google;event.tenantId: identyfikator najemcy Identity Platform powiązany z użytkownikiem (jeśli dotyczy).
Aktywowanie funkcji po usunięciu użytkownika
Podobnie jak w przypadku tworzenia konta użytkownika, możesz też wywołać funkcję w odpowiedzi na zdarzenie usunięcia konta. Użyj modułu obsługi zdarzeń onUserDeleted z firebase-functions/v2/identity, jak pokazano 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 projekcie domyślnym.
Aktywowanie funkcji blokujących
Jeśli masz uaktualnioną wersję Firebase Authentication with Identity Platform, możesz rozszerzyć Firebase Authentication za pomocą funkcji blokujących.
Funkcje blokujące umożliwiają synchroniczne wykonywanie niestandardowego kodu, który modyfikuje wynik rejestracji lub logowania użytkownika w aplikacji. W przeciwieństwie do aktywatorów działających w tle, które są uruchamiane asynchronicznie po zakończeniu zdarzenia, funkcje blokujące umożliwiają uniemożliwienie uwierzytelnienia użytkownika, jeśli nie spełnia on określonych kryteriów, lub zaktualizowanie informacji i uprawnień użytkownika przed zwróceniem ich do aplikacji klienckiej.
Sprawdzone metody dotyczące aktywatorów drugiej generacji
Podczas wdrażania aktywatorów uwierzytelniania drugiej generacji pamiętaj o tych sprawdzonych metodach:
- Uwzględnij równoczesność: instancje Cloud Functions (2 generacji) przetwarzają żądania równoczesne (domyślnie 80 żądań równoczesnych, gdy procesor ≥ 1). Upewnij się, że funkcja nie opiera się na globalnym stanie zmiennym między równoczesnymi wykonaniami.
- Projektowanie pod kątem idempotencji: dostarczanie zdarzeń w 2 generacji odbywa się co najmniej raz za pomocą Eventarc. Upewnij się, że 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.
- Zakres funkcji wielofirmowych: jeśli Twoja aplikacja korzysta z wielofirmowości Identity Platform, sprawdź, czy funkcje powinny obsługiwać zdarzenia we wszystkich firmach czy tylko w określonych. Użyj
tenantId: IS_NOT_TENANT, aby uniemożliwić użytkownikom najemcy aktywowanie funkcji przeznaczonych tylko dla projektu głównego. - Zarządzanie regionami i alokacją zasobów: określ lokalizację funkcji (
region), aby zminimalizować opóźnienie sieci między dostawcą uwierzytelniania a środowiskiem wykonywania funkcji.