ทริกเกอร์การตรวจสอบสิทธิ์ 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) เพื่อลดเวลาในการตอบสนองของเครือข่ายระหว่างผู้ให้บริการตรวจสอบสิทธิ์ กับสภาพแวดล้อมการเรียกใช้ฟังก์ชัน