میتوانید در پاسخ به ایجاد و حذف حسابهای کاربری 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 رویدادهای ایجاد کاربر را برای 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تنظیم کنید تا فقط برای کاربران ایجادشده در پروژه پیشفرض گوش دهد. - مستأجر خاص: شناسه رشته مستأجر (برای مثال،
{ 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 (نسل دوم) درخواستهای همزمان را پردازش میکنند (بهطور پیشفرض ۸۰ درخواست همزمان وقتی CPU ≥ ۱ باشد). مطمئن شوید که تابع شما به حالت تغییرپذیر سراسری بین اجراهای همزمان متکی نباشد.
- طراحی برای یکسانتوانی: تحویل رویداد در نسل دوم حداقل یکبار ازطریق Eventarc انجام میشود. مطمئن شوید که توابع شما یکسانتوان هستند؛ برای مثال، قبلاز انجام عوارض جانبی، بررسی کنید که ایمیل خوشامدگویی قبلاً ارسال نشده باشد یا ورودی پایگاه داده مقداردهی اولیه نشده باشد.
- محدوده توابع چندمستأجری: اگر برنامه شما از چندمستأجری Identity Platform استفاده میکند، بررسی کنید که آیا توابع شما باید رویدادها را در همه مستأجران مدیریت کنند یا فقط در مستأجران خاص. از
tenantId: IS_NOT_TENANTاستفاده کنید تا از راهاندازی توابعی که فقط برای پروژه اصلی درنظر گرفته شدهاند توسط کاربران مستأجر جلوگیری کنید. - مدیریت مناطق و تخصیص منابع: مکان تابع (
region) را مشخص کنید تا تأخیر شبکه بین ارائهدهنده اصالتسنجی و محیط اجرای تابع شما به حداقل برسد.