گسترش «اصالت‌سنجی Firebase» با Cloud Functions

می‌توانید توابع را در پاسخ به ایجاد و حذف حساب‌های کاربر 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 در موارد زیر راه‌اندازی می‌کند:

  • کاربر نشانی ایمیل و گذرواژه‌ای ایجاد می‌کند.
  • کاربری برای اولین‌بار بااستفاده از ارائه‌دهنده هویت فدرال به سیستم وارد می‌شود.
  • توسعه‌دهنده بااستفاده از «کیت توسعه نرم‌افزار سرپرست» Firebase حسابی ایجاد می‌کند.
  • کاربری برای اولین‌بار به سیستم جلسه اصالت‌سنجی ناشناس جدید وارد می‌شود.

رویداد 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);
  },
);

اگر پروژه شما از چندکاربره بودن «پلاتفرم هویت» استفاده می‌کند، می‌توانید محدوده راه‌انداز را تعیین کنید:

  • پروژه پیش‌فرض (بدون مستأجر): tenantId را روی IS_NOT_TENANT تنظیم کنید تا فقط برای کاربرانی که در پروژه پیش‌فرض ایجاد شده‌اند گوش دهید.
  • مستأجر خاص: شناسه رشته مستأجر (برای مثال، { tenantId: "tenant-id-1" }) را ارائه دهید تا فقط به کاربران ایجادشده در آن مستأجر گوش دهید.
  • همه مستأجران و کاربران: اگر tenantId حذف شود، تابع در رویدادهای ایجاد کاربر در همه مستأجران و کاربران پروژه پیش‌فرض در پروژه راه‌اندازی می‌شود.

علاوه‌بر tenantId، می‌توانید گزینه‌های پیکربندی استاندارد نسل دوم ازجمله region، concurrency، cpu، memory، timeoutSeconds، minInstances، maxInstances، و secrets را مشخص کنید.

دسترسی به مشخصه‌های کاربر

از داده‌های کاربری که به تابع شما برگردانده می‌شود، می‌توانید ازطریق event.data به فهرست مشخصه‌های کاربر دردسترس در شیء UserRecord کاربر تازه ایجادشده دسترسی پیدا کنید. برای مثال، می‌توانید ایمیل و نام نمایشی کاربر را به‌صورت زیر دریافت کنید:

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