Activadores de Firebase Authentication

Puedes activar las funciones en respuesta a la creación o eliminación de cuentas de usuario de Firebase Authentication. Por ejemplo, podrías enviar un correo electrónico de bienvenida a un usuario que acaba de crear una cuenta en tu app. Los ejemplos de esta página se basan en una muestra que hace exactamente eso: envía correos electrónicos de bienvenida y despedida cuando se crea y borra una cuenta, respectivamente.

Para ver más ejemplos de casos de uso, consulta ¿Qué puedo hacer con Cloud Functions?

Activa una función cuando se crea un usuario

Puedes crear una función que se active cuando se cree un usuario de Authentication con el controlador de eventos onUserCreated del subpaquete 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);
  },
);

Las cuentas de Authentication activarán eventos de creación de usuarios para Cloud Functions en los siguientes casos:

  • Un usuario crea una cuenta de correo electrónico y una contraseña.
  • Un usuario accede por primera vez mediante un proveedor de identidad federada.
  • El desarrollador crea una cuenta mediante el SDK de Admin.
  • Un usuario accede a una sesión de autenticación anónima por primera vez.

Un evento Cloud Functions no se activa cuando un usuario accede por primera vez con un token personalizado.

Configura las opciones de activación y la arquitectura multiusuario

Puedes configurar tu función pasando un objeto de opciones (AuthOptions) como primer parámetro 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);
  },
);

Si tu proyecto usa multiinquilinos de Identity Platform, puedes definir el alcance del activador de la siguiente manera:

  • Proyecto predeterminado (sin arrendatario): Establece tenantId en IS_NOT_TENANT para escuchar solo a los usuarios creados en el proyecto predeterminado.
  • Grupo de usuarios específico: Proporciona el ID de cadena del grupo de usuarios (por ejemplo, { tenantId: "tenant-id-1" }) para escuchar solo a los usuarios creados en ese grupo de usuarios.
  • Todos los usuarios y arrendatarios: Si se omite tenantId, la función se activa en los eventos de creación de usuarios en todos los arrendatarios y usuarios predeterminados del proyecto.

Además de tenantId, puedes especificar opciones de configuración estándar de 2ª gen., como region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances y secrets.

Accede a los atributos de usuario

A partir de los datos del usuario obtenidos mediante tu función, puedes acceder a la lista de atributos del usuario disponible en el objeto UserRecord del usuario creado recientemente a través de event.data. Por ejemplo, puedes obtener el correo electrónico y el nombre visible del usuario de la siguiente forma:

const { uid, email, displayName } = event.data;

Los activadores de autenticación en la 2ª gen. reciben un objeto AuthEvent. Además de event.data, puedes acceder a metadatos de eventos, como los siguientes:

  • event.id: Es un identificador único del evento.
  • event.type: Es el tipo de evento (google.firebase.auth.user.v2.created).
  • event.time: Es una marca de tiempo ISO 8601 que representa el momento en que ocurrió el evento.
  • event.project: El ID del proyecto de Google Cloud.
  • event.tenantId: Es el ID del arrendatario de Identity Platform asociado al usuario, si corresponde.

Activa una función cuando se borra un usuario

Así como puedes activar una función cuando se crea un usuario, puedes responder a los eventos de eliminación de usuarios. Usa el controlador de eventos onUserDeleted de firebase-functions/v2/identity como se muestra a continuación:

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);
  },
);

Al igual que con onUserCreated, puedes configurar onUserDeleted con opciones como { tenantId: IS_NOT_TENANT } para restringir los activadores a los usuarios del proyecto predeterminado.

Activa funciones de bloqueo

Si actualizaste a Firebase Authentication with Identity Platform, puedes extender Firebase Authentication con funciones de bloqueo.

Las funciones de bloqueo te permiten ejecutar código personalizado de forma síncrona que modifica el resultado de un usuario que se registra o accede a tu app. A diferencia de los activadores en segundo plano, que se ejecutan de forma asíncrona después de que finaliza un evento, las funciones de bloqueo te permiten evitar que un usuario se autentique si no cumple con ciertos criterios, o actualizar la información y los reclamos de un usuario antes de mostrárselos a tu app cliente.

Prácticas recomendadas para los activadores de 2ª generación

Cuando implementes activadores de autenticación de 2ª gen., ten en cuenta las siguientes prácticas recomendadas:

  • Ten en cuenta la simultaneidad: Las instancias de Cloud Functions (2ª gen.) procesan solicitudes simultáneas (de forma predeterminada, 80 solicitudes simultáneas cuando la CPU es ≥ 1). Asegúrate de que tu función no dependa del estado global mutable entre ejecuciones simultáneas.
  • Diseña para la idempotencia: La entrega de eventos en la 2ª gen. es al menos una vez a través de Eventarc. Asegúrate de que tus funciones sean idempotentes. Por ejemplo, verifica que no se haya enviado un correo electrónico de bienvenida o que no se haya inicializado una entrada de base de datos antes de realizar efectos secundarios.
  • Delimita el alcance de las funciones multiusuario: Si tu aplicación usa la función multiusuario de Identity Platform, verifica si tus funciones deben controlar eventos en todos los usuarios o solo en algunos específicos. Usa tenantId: IS_NOT_TENANT para evitar que los usuarios del arrendatario activen funciones destinadas solo al proyecto principal.
  • Administra las regiones y la asignación de recursos: Especifica la ubicación de la función (region) para minimizar la latencia de red entre tu proveedor de autenticación y el entorno de ejecución de la función.