Điều kiện kích hoạt Xác thực Firebase

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 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 điều này — gửi email chào mừng và 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 phần Tôi có thể làm gì với Cloud Functions?.

Kích hoạt một hàm khi người dùng được tạo

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 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);
  },
);

Tài khoản Authentication sẽ kích hoạt các sự kiện tạo người dùng cho Cloud Functions khi:

  • Người dùng tạo tài khoản email và mật khẩu.
  • Người dùng đăng nhập lần đầu bằng nhà cung cấp danh tính được liên kết.
  • Lập trình viên tạo một 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 lựa chọn về điều kiện kích hoạt và nhiều đối tượng 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 nhiều đối tượng thuê của Identity Platform, 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ê bao): Đặt tenantId thành IS_NOT_TENANT để chỉ theo dõi những 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ả đối tượng thuê và người dùng: Nếu bạn bỏ qua tenantId, 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 lựa chọn cấu hình tiêu chuẩn thế hệ thứ 2, bao gồm region, concurrency, cpu, memory, timeoutSeconds, minInstances, maxInstancessecrets.

Truy cập vào thuộc tính người dùng

Từ dữ liệu người dùng được trả về cho hàm của bạn, bạn có thể truy cập vào danh sách các 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ư minh hoạ:

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

Các trình kích hoạt xác thực trong thế hệ thứ 2 sẽ 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 duy nhấ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 biểu thị thời điểm xảy ra sự kiện.
  • event.project: Mã dự án trên đám mây của Google.
  • event.tenantId: Mã nhận dạng đối tượng thuê bao Identity Platform được liên kết với người dùng (nếu có).

Kích hoạt một hàm khi người dùng bị xoá

Giống như có thể kích hoạt một hàm khi người dùng tạo, bạn cũng 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 lựa chọn như { tenantId: IS_NOT_TENANT } để hạn chế điều kiện kích hoạt đối với người dùng trong dự án mặc định.

Hàm chặn kích hoạt

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 các hàm chặn.

Các 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 một 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ư các trình kích hoạt ở chế độ nền (chạy không đồng bộ sau khi một sự kiện kết thúc), cá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à các xác nhận quyền sở hữu của người dùng trước khi trả về cho ứng dụng khách của bạn.

Các phương pháp hay nhất cho trình kích hoạt thế hệ thứ 2

Khi triển khai các 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 phiên bản 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 trên toàn cục giữa các lần thực thi đồng thời.
  • Thiết kế để có tính chất bất biến: Việc phân phối sự kiện ở thế hệ thứ 2 là ít nhất một lần thông qua Eventarc. Đảm bảo các hàm của bạn là hàm đẳng phương; 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 nhiều đối tượng thuê bao: Nếu ứng dụng của bạn sử dụng tính năng nhiều đối tượng thuê bao của Identity Platform, hãy xác minh xem các hàm của bạn có xử lý các sự kiện trên tất cả đối tượng thuê bao hay chỉ một số đối tượng thuê bao cụ thể. Dùng tenantId: IS_NOT_TENANT để ngăn người dùng thuê bao kích hoạt các hàm chỉ dành cho dự án chính.
  • Quản lý khu vực và việc phân bổ tài nguyên: Chỉ định vị trí của 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.