Вы можете запускать функции в ответ на создание и удаление учетных записей пользователей 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: Идентификатор клиента платформы идентификации, связанный с пользователем (если применимо).
Запустить функцию при удалении пользователя
Подобно тому, как вы можете запускать функцию при создании пользователя, вы можете реагировать на события удаления пользователя. Используйте обработчик событий 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 (2-го поколения) обрабатывают одновременные запросы (по умолчанию — 80 одновременных запросов при загрузке ЦП ≥ 1). Убедитесь, что ваша функция не зависит от глобального изменяемого состояния между одновременными выполнениями.
- Проектирование с учетом идемпотентности : во втором поколении доставка событий осуществляется как минимум один раз через Eventarc. Убедитесь, что ваши функции идемпотентны; например, проверьте, не было ли уже отправлено приветственное письмо или инициализирована запись в базе данных, прежде чем выполнять побочные эффекты.
- Ограничение области действия многопользовательских функций : Если ваше приложение использует многопользовательскую архитектуру Identity Platform, проверьте, должны ли ваши функции обрабатывать события во всех арендаторах или только в определенных. Используйте
tenantId: IS_NOT_TENANTчтобы предотвратить запуск пользователями арендатора функций, предназначенных только для основного проекта. - Управление регионами и распределением ресурсов : укажите местоположение функции (
region), чтобы минимизировать задержку в сети между вашим поставщиком аутентификации и средой выполнения функции.