您可以觸發函式,以回應使用者帳戶的建立和刪除事件。Firebase Authentication舉例來說,您可以向剛在您的應用程式中建立帳戶的使用者傳送歡迎電子郵件。本頁的範例就是根據這個做法,在帳戶建立和刪除時傳送歡迎和告別電子郵件。
如需更多用途範例,請參閱「Cloud Functions 的用途有哪些?」。
在使用者建立帳戶時觸發函式
您可以建立函式,在透過 firebase-functions/v2/identity 子套件的 onUserCreated 事件處理常式建立 Authentication 使用者時觸發:
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 帳戶會在下列情況,針對 Cloud Functions 觸發使用者建立事件:
- 使用者建立電子郵件帳戶與密碼。
- 使用者第一次透過聯合身分識別資訊提供者登入。
- 開發人員使用 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,只監聽在預設專案中建立的使用者。 - 特定租戶:提供租戶的字串 ID (例如
{ tenantId: "tenant-id-1" }),只監聽在該租戶中建立的使用者。 - 所有用戶和使用者:如果省略
tenantId,函式會在專案中所有用戶和預設專案使用者的使用者建立事件觸發。
除了 tenantId 之外,您還可以指定標準第 2 代設定選項,包括 region、concurrency、cpu、memory、timeoutSeconds、minInstances、maxInstances 和 secrets。
存取使用者屬性
從傳回函式的使用者資料中,您可以透過 event.data 存取新建立使用者 UserRecord 物件中可用的使用者屬性清單。舉例來說,您可以取得使用者的電子郵件地址和顯示名稱,如下所示:
const { uid, email, displayName } = event.data;
第 2 代的驗證觸發程序會收到 AuthEvent 物件。除了 event.data 之外,您還可以存取事件中繼資料,例如:
event.id:事件的專屬 ID。event.type:事件類型 (google.firebase.auth.user.v2.created)。event.time:以 ISO 8601 時間戳記表示事件發生時間。event.project:Google Cloud 專案 ID。event.tenantId:與使用者相關聯的 Identity Platform 租戶 ID (如適用)。
在使用者刪除時觸發函式
就像您可以在使用者建立帳戶時觸發函式一樣,您也可以回應使用者刪除帳戶的事件。使用 firebase-functions/v2/identity 中的 onUserDeleted 事件處理常式,如下所示:
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。
封鎖函式可讓你同步執行自訂程式碼,藉此修改使用者註冊或登入應用程式的結果。與事件完成後非同步執行的背景觸發程序不同,封鎖函式可讓您在使用者不符合特定條件時,禁止他們通過驗證,或是在將使用者資訊和聲明傳回用戶端應用程式前,先更新這些資訊。
第 2 代觸發條件的最佳做法
導入第 2 代驗證觸發程序時,請注意下列最佳做法:
- 考量並行處理能力:Cloud Functions (第 2 代) 執行個體會處理並行要求 (CPU ≥ 1 時,預設為 80 個並行要求)。請確保函式在並行執行期間,不會依賴全域可變動狀態。
- 設計冪等性:第 2 代的事件傳遞是透過 Eventarc「至少一次」傳遞。請確保函式是等冪的,例如在執行副作用前,先確認歡迎電子郵件尚未寄出,或資料庫項目尚未初始化。
- 設定多租戶函式的範圍:如果應用程式使用 Identity Platform 多租戶功能,請確認函式應處理所有租戶的事件,還是只處理特定租戶的事件。使用
tenantId: IS_NOT_TENANT可防止租戶使用者觸發僅供主要專案使用的函式。 - 管理區域和資源分配:指定函式位置 (
region),盡量縮短驗證供應商與函式執行環境之間的網路延遲時間。