Możesz wywoływać funkcje w odpowiedzi na tworzenie i usuwanieFirebase Authentication kont użytkowników. Możesz na przykład wysłać e-maila z powitaniem 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 z powitaniem i pożegnaniem 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 jest wywoływana, gdy użytkownik Authentication 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 sesji uwierzytelniania anonimowego.
Zdarzenie Cloud Functions nie jest wywoływane, gdy użytkownik loguje się po raz pierwszy za pomocą niestandardowego tokena.
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 wyzwalacza:
- Projekt domyślny (bez najemcy): ustaw wartość
tenantIdnaIS_NOT_TENANT, aby nasłuchiwać tylko użytkowników utworzonych w projekcie domyślnym. - Określony najemca: podaj identyfikator ciągu znaków najemcy (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 zostanie wywołana w przypadku zdarzeń tworzenia użytkowników we wszystkich najemcach i domyślnych użytkownikach projektu.
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 nowo utworzonym obiekcie UserRecord 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.
Wywoływanie funkcji po usunięciu konta 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.
Dzięki funkcjom blokowania możesz synchronicznie uruchamiać niestandardowy kod, który zmienia reakcję aplikacji na zarejestrowanie się lub zalogowanie użytkownika. W przeciwieństwie do wyzwalaczy działających w tle, które są uruchamiane asynchronicznie po zakończeniu zdarzenia, funkcje blokowania 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 procesor ≥ 1). Upewnij się, że 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.