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 campione che fa esattamente questo: invia email di benvenuto e di addio al momento della creazione e dell'eliminazione dell'account.
Per altri esempi di casi d'uso, vedi Che cosa posso fare con Cloud Functions?
Attivare 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 attiveranno 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.
Configurare le opzioni di trigger e il multi-tenancy
Puoi configurare la funzione passando un oggetto di 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 del progetto predefiniti nel 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.
Accedere agli attributi utente
Dai dati utente restituiti alla tua funzione, puoi accedere all'elenco degli attributi utente disponibili nell'oggetto UserRecord dell'utente appena creato tramite event.data. Ad esempio, puoi ottenere l'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 per l'evento.event.type: il tipo di evento (google.firebase.auth.user.v2.created).event.time: un timestamp ISO 8601 che indica quando si è verificato l'evento.event.project: l'ID progetto Google Cloud.event.tenantId: l'ID tenant Identity Platform associato all'utente, se applicabile.
Attivare una funzione all'eliminazione dell'utente
Proprio come puoi attivare una funzione alla creazione di un utente, puoi rispondere agli eventi di eliminazione
dell'utente. Utilizza il
gestore di eventi onUserDeleted
di firebase-functions/v2/identity come mostrato:
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 gli attivatori agli utenti del progetto predefinito.
Attivare 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 codice personalizzato in modo sincrono 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 l'autenticazione di un utente se non soddisfa determinati criteri o di aggiornare le informazioni e le rivendicazioni di un utente prima di restituirle all'app client.
Best practice per gli attivatori di 2ª gen.
Quando implementi i trigger di autenticazione di 2ª gen., tieni presente le seguenti best practice:
- Tieni conto della concorrenza: le istanze di Cloud Functions (2ª gen.) elaborano richieste simultanee (per impostazione predefinita, 80 richieste simultanee quando la CPU è ≥ 1). Assicurati che la funzione non si basi su uno stato globale modificabile 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 un'email di benvenuto non sia già stata inviata o che una voce di database sia stata inizializzata prima di eseguire effetti collaterali.
- Definisci l'ambito delle funzioni multitenant: se la tua applicazione utilizza il multitenancy 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 posizione della funzione
(
region) per ridurre al minimo la latenza di rete tra il provider di autenticazione e l'ambiente di esecuzione della funzione.