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