ทริกเกอร์การตรวจสอบสิทธิ์ Firebase

คุณสามารถทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการสร้างและการลบบัญชีผู้ใช้ 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 แล้ว คุณยังระบุตัวเลือกการกำหนดค่ามาตรฐานรุ่นที่ 2 ได้ ซึ่งรวมถึง region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances และ secrets

เข้าถึงแอตทริบิวต์ของผู้ใช้

จากข้อมูลผู้ใช้ที่แสดงผลไปยังฟังก์ชัน คุณสามารถเข้าถึงรายการแอตทริบิวต์ผู้ใช้ที่มีอยู่ในออบเจ็กต์ UserRecord ของผู้ใช้ที่สร้างใหม่ผ่าน event.data ตัวอย่างเช่น คุณสามารถรับอีเมลและชื่อที่แสดงของผู้ใช้ได้ดังที่แสดงต่อไปนี้

const { uid, email, displayName } = event.data;

ทริกเกอร์การตรวจสอบสิทธิ์ในรุ่นที่ 2 จะได้รับออบเจ็กต์ 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 โดยใช้ฟังก์ชันการบล็อก

ฟังก์ชันการบล็อกช่วยให้คุณเรียกใช้โค้ดที่กำหนดเองแบบซิงโครนัสซึ่งจะแก้ไขผลลัพธ์ของการลงทะเบียนหรือลงชื่อเข้าใช้แอปของผู้ใช้ ฟังก์ชันการบล็อกต่างจากทริกเกอร์เบื้องหลังซึ่งทำงานแบบอะซิงโครนัสหลังจากเหตุการณ์เสร็จสิ้น โดยจะช่วยให้คุณป้องกันไม่ให้ผู้ใช้ตรวจสอบสิทธิ์ได้หากไม่เป็นไปตามเกณฑ์บางอย่าง หรืออัปเดตข้อมูลและการอ้างสิทธิ์ของผู้ใช้ก่อนที่จะส่งกลับไปยังแอปไคลเอ็นต์

แนวทางปฏิบัติแนะนำสำหรับทริกเกอร์รุ่นที่ 2

เมื่อใช้ทริกเกอร์การตรวจสอบสิทธิ์รุ่นที่ 2 โปรดคำนึงถึงแนวทางปฏิบัติแนะนำต่อไปนี้

  • พิจารณาการทำงานพร้อมกัน: อินสแตนซ์ Cloud Functions (รุ่นที่ 2) จะประมวลผลคำขอหลายรายการพร้อมกัน (ค่าเริ่มต้นคือคำขอหลายรายการพร้อมกัน 80 รายการเมื่อ CPU ≥ 1) ตรวจสอบว่าฟังก์ชันของคุณไม่ได้อาศัยสถานะที่เปลี่ยนแปลงได้ทั่วไประหว่างการดำเนินการที่เกิดขึ้นพร้อมกัน
  • ออกแบบเพื่อความสอดคล้องกัน: การส่งเหตุการณ์ในรุ่นที่ 2 จะเกิดขึ้นอย่างน้อย 1 ครั้งผ่าน Eventarc ตรวจสอบว่าฟังก์ชันเป็นแบบ Idempotent เช่น ตรวจสอบว่ายังไม่ได้ส่งอีเมลต้อนรับหรือเริ่มต้นรายการฐานข้อมูลก่อนที่จะดำเนินการผลข้างเคียง
  • กำหนดขอบเขตฟังก์ชันแบบหลายกลุ่มผู้ใช้: หากแอปพลิเคชันของคุณใช้ Identity Platform แบบหลายกลุ่มผู้ใช้ ให้ตรวจสอบว่าฟังก์ชันควรจัดการเหตุการณ์ในกลุ่มผู้ใช้ทั้งหมดหรือเฉพาะบางกลุ่ม ใช้ tenantId: IS_NOT_TENANT เพื่อป้องกันไม่ให้ผู้ใช้กลุ่มผู้เช่าเรียกใช้ฟังก์ชันที่มีไว้สำหรับโปรเจ็กต์หลักเท่านั้น
  • จัดการภูมิภาคและการจัดสรรทรัพยากร: ระบุตำแหน่งของฟังก์ชัน (region) เพื่อลดเวลาในการตอบสนองของเครือข่ายระหว่างผู้ให้บริการตรวจสอบสิทธิ์กับสภาพแวดล้อมการดำเนินการของฟังก์ชัน