محرک های احراز هویت Firebase

شما می‌توانید توابعی را در پاسخ به ایجاد و حذف حساب‌های کاربری Firebase Authentication فعال کنید. برای مثال، می‌توانید یک ایمیل خوشامدگویی برای کاربری که به تازگی در برنامه شما حساب کاربری ایجاد کرده است، ارسال کنید. مثال‌های این صفحه بر اساس نمونه‌ای است که دقیقاً همین کار را انجام می‌دهد - ارسال ایمیل‌های خوشامدگویی و خداحافظی پس از ایجاد و حذف حساب کاربری.

برای مثال‌های بیشتر از موارد استفاده، به «با توابع ابری چه کاری می‌توانم انجام دهم؟» مراجعه کنید.

فعال کردن یک تابع هنگام ایجاد کاربر

شما می‌توانید با استفاده از رویداد onUserCreated از زیربسته‌ی firebase-functions/v2/identity تابعی ایجاد کنید که هنگام ایجاد یک کاربر 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 رویدادهای ایجاد کاربر را برای عملکردهای ابری فعال می‌کنند، زمانی که:

  • کاربر یک حساب ایمیل و رمز عبور ایجاد می‌کند.
  • کاربری برای اولین بار با استفاده از یک ارائه‌دهنده هویت فدرال وارد سیستم می‌شود.
  • توسعه‌دهنده با استفاده از Admin SDK یک حساب کاربری ایجاد می‌کند.
  • کاربری برای اولین بار وارد یک جلسه احراز هویت ناشناس جدید می‌شود.

رویداد Cloud Functions زمانی که کاربر برای اولین بار با استفاده از یک توکن سفارشی وارد سیستم می‌شود، فعال نمی‌شود .

پیکربندی گزینه‌های تریگر و چند مستاجری

شما می‌توانید تابع خود را با ارسال یک شیء options ( 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 با استفاده از توابع مسدودکننده گسترش دهید.

توابع مسدودکننده به شما امکان می‌دهند کد سفارشی را به صورت همزمان اجرا کنید که نتیجه ثبت نام یا ورود کاربر به برنامه شما را تغییر می‌دهد. برخلاف تریگرهای پس‌زمینه که پس از پایان یک رویداد به صورت غیرهمزمان اجرا می‌شوند، توابع مسدودکننده به شما امکان می‌دهند در صورت عدم رعایت معیارهای خاص، از احراز هویت کاربر جلوگیری کنید، یا اطلاعات و ادعاهای کاربر را قبل از بازگرداندن آن به برنامه کلاینت خود به‌روزرسانی کنید.

بهترین روش‌ها برای تریگرهای نسل دوم

هنگام پیاده‌سازی محرک‌های احراز هویت نسل دوم، نکات زیر را در نظر داشته باشید:

  • در نظر گرفتن همزمانی : نمونه‌های توابع ابری (نسل دوم) درخواست‌های همزمان را پردازش می‌کنند (به‌طور پیش‌فرض وقتی CPU ≥ 1 باشد، 80 درخواست همزمان). مطمئن شوید که تابع شما بین اجراهای همزمان به حالت تغییرپذیر سراسری متکی نیست.
  • طراحی برای خودتوانی : تحویل رویداد در نسل دوم حداقل یک بار از طریق Eventarc انجام می‌شود. مطمئن شوید که توابع شما خودتوان هستند. برای مثال، قبل از انجام عوارض جانبی، مطمئن شوید که ایمیل خوشامدگویی ارسال نشده باشد یا ورودی پایگاه داده مقداردهی اولیه نشده باشد.
  • توابع چند مستاجری محدوده : اگر برنامه شما از چند مستاجری پلتفرم هویت استفاده می‌کند، بررسی کنید که آیا توابع شما باید رویدادها را در همه مستاجران مدیریت کنند یا فقط برای موارد خاص. tenantId: IS_NOT_TENANT استفاده کنید تا از اجرای توابعی که فقط برای پروژه اصلی در نظر گرفته شده‌اند توسط کاربران مستاجر جلوگیری شود.
  • مدیریت مناطق و تخصیص منابع : مکان تابع ( region ) را مشخص کنید تا تأخیر شبکه بین ارائه دهنده احراز هویت و محیط اجرای تابع شما به حداقل برسد.