Функции можно запускать в ответ на создание и удаление аккаунтов пользователей Firebase Authentication. Например, можно отправить приветственное письмо пользователю, который только что создал аккаунт в вашем приложении. Примеры на этой странице основаны на образце, который делает именно это – отправляет приветственные и прощальные письма при создании и удалении аккаунта.
Другие примеры использования приведены в разделе Что можно делать с помощью Cloud Functions.
Как активировать функцию при создании пользователя
Вы можете создать функцию, которая будет запускаться при создании пользователя Authentication с помощью обработчика событий onUserCreated из подпакета 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); }, );
Аккаунты Authentication будут запускать события создания пользователей для облачных функций, когда:
- Пользователь создает аккаунт электронной почты и пароль.
- Пользователь впервые входит в аккаунт, используя федеративного поставщика идентификационной информации.
- Разработчик создает аккаунт с помощью Admin SDK.
- Пользователь впервые входит в новый анонимный сеанс аутентификации.
Событие Cloud Functions не запускается, когда пользователь впервые входит в аккаунт с помощью специального токена.
Настройка параметров триггера и многопользовательского режима
Вы можете настроить функцию, передав объект параметров (AuthOptions) в качестве первого параметра функции 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); }, );
Если в вашем проекте используется мультитенантность Identity Platform, вы можете задать область действия триггера:
- Проект по умолчанию (без клиента): установите для параметра
tenantIdзначениеIS_NOT_TENANT, чтобы прослушивать только пользователей, созданных в проекте по умолчанию. - Определенный клиент. Укажите строковый идентификатор клиента (например,
{ tenantId: "tenant-id-1" }), чтобы получать данные только о пользователях, созданных в этом клиенте. - Все клиенты и пользователи. Если параметр
tenantIdне указан, функция запускается при создании пользователей во всех клиентах и пользователей проекта по умолчанию.
Помимо tenantId, вы можете указать стандартные параметры конфигурации второго поколения, в том числе region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances и secrets.
Как получить доступ к атрибутам пользователей
Из пользовательских данных, возвращенных вашей функции, можно получить доступ к списку атрибутов пользователя, доступных в объекте UserRecord нового пользователя, с помощью event.data. Например, вы можете получить адрес электронной почты и отображаемое имя пользователя, как показано ниже:
const { uid, email, displayName } = event.data;
Триггеры аутентификации второго поколения получают объект AuthEvent. Помимо event.data, вы можете получить доступ к метаданным событий, таким как:
event.id– уникальный идентификатор события.event.type– тип события (google.firebase.auth.user.v2.created).event.time– временная метка ISO 8601, указывающая, когда произошло событие.event.project– идентификатор проекта Google Cloud.event.tenantId– идентификатор клиента Identity Platform, связанный с пользователем, если применимо.
Как активировать функцию при удалении аккаунта пользователя
Вы можете настроить функцию, которая будет запускаться при удалении пользователя. Используйте обработчик событий onUserDeleted из firebase-functions/v2/identity, как показано ниже:
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); }, );
Как и в случае с onUserCreated, вы можете настроить onUserDeleted с помощью таких параметров, как { tenantId: IS_NOT_TENANT }, чтобы ограничить триггеры пользователями в проекте по умолчанию.
Функции блокировки триггеров
Если вы перешли на версию Firebase Authentication with Identity Platform, то можете расширить возможности Firebase Authentication, используя блокирующие функции.
Блокирующие функции позволяют синхронно выполнять специальный код, который изменяет результат регистрации или входа пользователя в приложение. В отличие от фоновых триггеров, которые выполняются асинхронно после завершения события, блокирующие функции позволяют запретить пользователю аутентификацию, если он не соответствует определенным критериям, или обновить информацию и утверждения пользователя, прежде чем вернуть их клиентскому приложению.
Рекомендации по использованию триггеров второго поколения
При реализации триггеров аутентификации второго поколения следуйте приведенным ниже рекомендациям.
- Учитывайте параллелизм. Экземпляры Cloud Functions (второго поколения) обрабатывают параллельные запросы (по умолчанию 80 параллельных запросов, если ЦП ≥ 1). Убедитесь, что функция не полагается на глобальное изменяемое состояние между параллельными выполнениями.
- Проектируйте с учетом идемпотентности. Во втором поколении доставка событий выполняется с помощью Eventarc не менее одного раза. Убедитесь, что ваши функции идемпотентны. Например, перед выполнением побочных эффектов проверьте, не было ли уже отправлено приветственное письмо или инициализирована запись в базе данных.
- Определите область действия функций для нескольких клиентов. Если в вашем приложении используется многопользовательский режим Identity Platform, проверьте, должны ли ваши функции обрабатывать события для всех клиентов или только для определенных. Используйте
tenantId: IS_NOT_TENANT, чтобы запретить пользователям клиента запускать функции, предназначенные только для основного проекта. - Управление регионами и распределением ресурсов. Укажите местоположение функции (
region), чтобы минимизировать задержку сети между поставщиком услуг аутентификации и средой выполнения функции.