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