Bạn có thể kích hoạt các hàm để phản hồi việc tạo và xoá tài khoản người dùng Firebase Authentication. Ví dụ: bạn có thể gửi email chào mừng đến một người dùng vừa tạo tài khoản trong ứng dụng của bạn. Các ví dụ trên trang này dựa trên một mẫu thực hiện chính xác việc này – gửi email chào mừng và email tạm biệt khi tạo và xoá tài khoản.
Để biết thêm ví dụ về các trường hợp sử dụng, hãy xem bài viết Tôi có thể làm gì với Cloud Functions?.
Kích hoạt một hàm khi tạo người dùng
Bạn có thể tạo một hàm kích hoạt khi người dùng Authentication được tạo bằng cách sử dụng trình xử lý sự kiện onUserCreated từ gói con 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 tài khoản sẽ kích hoạt sự kiện tạo người dùng cho Cloud Functions khi:
- Người dùng tạo một tài khoản email và mật khẩu.
- Người dùng đăng nhập lần đầu bằng một nhà cung cấp danh tính liên kết.
- Nhà phát triển tạo tài khoản bằng SDK dành cho quản trị viên.
- Người dùng đăng nhập vào một phiên xác thực ẩn danh mới lần đầu tiên.
Sự kiện Cloud Functions không được kích hoạt khi người dùng đăng nhập lần đầu bằng mã thông báo tuỳ chỉnh.
Định cấu hình các tuỳ chọn trình kích hoạt và chế độ nhiều người thuê
Bạn có thể định cấu hình hàm bằng cách truyền một đối tượng tuỳ chọn (AuthOptions) làm tham số đầu tiên cho 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); }, );
Nếu dự án của bạn sử dụng mô hình đa khách hàng của Nền tảng nhận dạng, bạn có thể đặt phạm vi cho điều kiện kích hoạt:
- Dự án mặc định (không có đối tượng thuê): Đặt
tenantIdthànhIS_NOT_TENANTđể chỉ theo dõi người dùng được tạo trong dự án mặc định. - Đối tượng thuê cụ thể: Cung cấp mã nhận dạng chuỗi của đối tượng thuê (ví dụ:
{ tenantId: "tenant-id-1" }) để chỉ theo dõi những người dùng được tạo trong đối tượng thuê đó. - Tất cả người dùng và đối tượng thuê: Nếu bạn bỏ qua
tenantId, thì hàm sẽ kích hoạt các sự kiện tạo người dùng trên tất cả đối tượng thuê và người dùng dự án mặc định trong dự án.
Ngoài tenantId, bạn có thể chỉ định các tuỳ chọn cấu hình thế hệ thứ 2 tiêu chuẩn, bao gồm region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstances và secrets.
Truy cập vào thuộc tính người dùng
Từ dữ liệu người dùng được trả về hàm, bạn có thể truy cập vào danh sách thuộc tính người dùng có trong đối tượng UserRecord của người dùng mới tạo thông qua event.data. Ví dụ: bạn có thể lấy email và tên hiển thị của người dùng như sau:
const { uid, email, displayName } = event.data;
Trình kích hoạt xác thực trong thế hệ thứ 2 nhận được một đối tượng AuthEvent. Ngoài event.data, bạn có thể truy cập vào siêu dữ liệu sự kiện, chẳng hạn như:
event.id: Giá trị nhận dạng riêng biệt cho sự kiện.event.type: Loại sự kiện (google.firebase.auth.user.v2.created).event.time: Dấu thời gian ISO 8601 cho biết thời điểm sự kiện xảy ra.event.project: Mã dự án trên đám mây của Google.event.tenantId: Mã nhận dạng đối tượng thuê Identity Platform liên kết với người dùng, nếu có.
Kích hoạt một hàm khi xoá người dùng
Giống như việc kích hoạt một hàm khi người dùng được tạo, bạn có thể phản hồi các sự kiện xoá người dùng. Sử dụng trình xử lý sự kiện onUserDeleted từ firebase-functions/v2/identity như minh hoạ:
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); }, );
Tương tự như onUserCreated, bạn có thể định cấu hình onUserDeleted bằng các tuỳ chọn như { tenantId: IS_NOT_TENANT } để hạn chế điều kiện kích hoạt cho người dùng trong dự án mặc định.
Kích hoạt hàm chặn
Nếu đã nâng cấp lên Firebase Authentication with Identity Platform, bạn có thể mở rộng Firebase Authentication bằng cách sử dụng hàm chặn.
Hàm chặn cho phép bạn thực thi mã tuỳ chỉnh một cách đồng bộ để sửa đổi kết quả của việc người dùng đăng ký hoặc đăng nhập vào ứng dụng của bạn. Không giống như trình kích hoạt trong nền (chạy không đồng bộ sau khi một sự kiện kết thúc), hàm chặn cho phép bạn ngăn người dùng xác thực nếu họ không đáp ứng một số tiêu chí nhất định, hoặc cập nhật thông tin và thông báo xác nhận quyền sở hữu của người dùng trước khi trả về ứng dụng khách.
Các phương pháp hay nhất cho trình kích hoạt thế hệ thứ 2
Khi triển khai trình kích hoạt xác thực thế hệ thứ 2, hãy lưu ý các phương pháp hay nhất sau đây:
- Tính đến tính đồng thời: Các thực thể Cloud Functions (thế hệ thứ 2) xử lý các yêu cầu đồng thời (mặc định là 80 yêu cầu đồng thời khi CPU ≥ 1). Đảm bảo rằng hàm của bạn không dựa vào trạng thái có thể thay đổi chung giữa các lần thực thi đồng thời.
- Thiết kế cho tính luỹ đẳng: Việc phân phối sự kiện trong thế hệ thứ 2 diễn ra ít nhất một lần thông qua Eventarc. Đảm bảo rằng các hàm của bạn là không thay đổi; ví dụ: xác minh rằng email chào mừng chưa được gửi hoặc mục nhập cơ sở dữ liệu chưa được khởi tạo trước khi thực hiện các tác dụng phụ.
- Phạm vi của các hàm đa khách hàng: Nếu ứng dụng của bạn sử dụng tính năng đa khách hàng của Identity Platform, hãy xác minh xem các hàm của bạn có nên xử lý sự kiện trên tất cả khách hàng hay chỉ một số khách hàng cụ thể. Sử dụng
tenantId: IS_NOT_TENANTđể ngăn người dùng của đối tượng thuê kích hoạt các hàm chỉ dành cho dự án chính. - Quản lý khu vực và phân bổ tài nguyên: Chỉ định vị trí hàm (
region) để giảm thiểu độ trễ mạng giữa nhà cung cấp dịch vụ xác thực và môi trường thực thi hàm.