Puoi attivare funzioni in risposta alla creazione e all'eliminazione di account utente Firebase Authentication. Ad esempio, potresti inviare un'email di benvenuto a un utente che ha appena creato un account nella tua app. Gli esempi in questa pagina si basano su un esempio che fa esattamente questo: invia email di benvenuto e di saluto al momento della creazione e dell'eliminazione dell'account.
Per altri esempi di casi d'uso, consulta Cosa posso fare con Cloud Functions?
Attiva una funzione alla creazione dell'utente
Puoi creare una funzione che si attiva quando viene creato un utente Authentication utilizzando il gestore di eventi onUserCreated del sottopacchetto 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); }, );
Gli account Authentication attivano eventi di creazione utente per Cloud Functions quando:
- Un utente crea un account email e una password.
- Un utente accede per la prima volta utilizzando un provider di identità federato.
- Lo sviluppatore crea un account utilizzando l'SDK Admin.
- Un utente accede per la prima volta a una nuova sessione di autenticazione anonima.
Un evento Cloud Functions non viene attivato quando un utente accede per la prima volta utilizzando un token personalizzato.
Configura le opzioni di attivazione e la multitenancy
Puoi configurare la funzione passando un oggetto opzioni (AuthOptions) come primo parametro a 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); }, );
Se il tuo progetto utilizza la multitenancy di Identity Platform, puoi definire l'ambito del trigger:
- Progetto predefinito (nessun tenant): imposta
tenantIdsuIS_NOT_TENANTper ascoltare solo gli utenti creati nel progetto predefinito. - Tenant specifico: fornisci l'ID stringa del tenant (ad esempio,
{ tenantId: "tenant-id-1" }) per ascoltare solo gli utenti creati in quel tenant. - Tutti i tenant e gli utenti: se
tenantIdviene omesso, la funzione viene attivata in base agli eventi di creazione degli utenti in tutti i tenant e gli utenti predefiniti del progetto.
Oltre a tenantId, puoi specificare le opzioni di configurazione standard di 2ª gen., tra cui region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances e secrets.
Accedi agli attributi utente
Dai dati utente restituiti alla funzione, puoi accedere all'elenco degli attributi utente disponibili nell'oggetto UserRecord dell'utente appena creato tramite event.data. Ad esempio, puoi ottenere l'indirizzo email e il nome visualizzato dell'utente come mostrato di seguito:
const { uid, email, displayName } = event.data;
I trigger di autenticazione di 2ª gen. ricevono un oggetto AuthEvent. Oltre a event.data, puoi accedere ai metadati degli eventi, ad esempio:
event.id: un identificatore univoco dell'evento.event.type: il tipo di evento (google.firebase.auth.user.v2.created).event.time: un timestamp ISO 8601 che rappresenta il momento in cui si è verificato l'evento.event.project: l'ID progetto Google Cloud.event.tenantId: l'ID tenant di Identity Platform associato all'utente, se applicabile.
Attiva una funzione in caso di eliminazione dell'utente
Così come puoi attivare una funzione alla creazione di un utente, puoi rispondere agli eventi di eliminazione degli utenti. Utilizza il gestore di eventi onUserDeleted di firebase-functions/v2/identity come mostrato di seguito:
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); }, );
Come per onUserCreated, puoi configurare onUserDeleted con opzioni come { tenantId: IS_NOT_TENANT } per limitare i trigger agli utenti del progetto predefinito.
Attiva le funzioni di blocco
Se hai eseguito l'upgrade a Firebase Authentication with Identity Platform, puoi estendere Firebase Authentication utilizzando le funzioni di blocco.
Le funzioni di blocco ti consentono di eseguire in modo sincrono codice personalizzato che modifica il risultato della registrazione o dell'accesso di un utente alla tua app. A differenza dei trigger in background, che vengono eseguiti in modo asincrono al termine di un evento, le funzioni di blocco ti consentono di impedire a un utente di autenticarsi se non soddisfa determinati criteri o di aggiornare le informazioni e le rivendicazioni di un utente prima di restituirle alla tua app client.
Best practice per i trigger di 2ª gen.
Quando implementi i trigger di autenticazione di 2ª generazione, tieni presente le seguenti best practice:
- Considera la contemporaneità: le istanze di Cloud Functions (2ª gen.) elaborano le richieste in parallelo (per impostazione predefinita, 80 richieste in parallelo quando la CPU è ≥ 1). Assicurati che la funzione non si basi su uno stato modificabile globale tra esecuzioni simultanee.
- Progetta per l'idempotenza: la distribuzione degli eventi nella 2ª gen. avviene almeno una volta tramite Eventarc. Assicurati che le tue funzioni siano idempotenti; ad esempio, verifica che non sia già stata inviata un'email di benvenuto o che non sia stata inizializzata una voce del database prima di eseguire effetti collaterali.
- Definisci l'ambito delle funzioni multi-tenant: se la tua applicazione utilizza la multi-tenancy di Identity Platform, verifica se le tue funzioni devono gestire gli eventi in tutti i tenant o solo in quelli specifici. Utilizza
tenantId: IS_NOT_TENANTper impedire agli utenti tenant di attivare funzioni destinate solo al progetto principale. - Gestisci le regioni e l'allocazione delle risorse: specifica la località della funzione (
region) per ridurre al minimo la latenza di rete tra il provider di autenticazione e l'ambiente di esecuzione della funzione.