Quản lý người dùng đa yếu tố

Tài liệu này chỉ cho bạn cách sử dụng SDK quản trị Firebase để quản lý người dùng đa yếu tố theo chương trình. Khi quản lý người dùng đa yếu tố, bạn có quyền truy cập vào nhiều thuộc tính người dùng hơn so với người dùng đơn yếu tố .

Trước khi bắt đầu

Cài đặt SDK quản trị Node.js. Các ngôn ngữ SDK quản trị khác hiện không được hỗ trợ.

Thu hút người dùng

Bạn có thể truy xuất dữ liệu liên quan đến nhiều yếu tố của người dùng, chẳng hạn như danh sách các yếu tố thứ hai đã đăng ký, từ đối tượng UserRecord . Để lấy bản ghi người dùng, hãy gọi getUser() hoặc getUserByEmail() .

Ví dụ dưới đây cho thấy người dùng đã đăng ký theo nhiều yếu tố:

// console.log(userRecord.toJSON());
{
  uid: 'some-uid',
  displayName: 'John Doe',
  email: 'johndoe@gmail.com',
  photoURL: 'http://www.example.com/12345678/photo.png',
  emailVerified: true,
  phoneNumber: '+11234567890',
  // Set this user as admin.
  customClaims: {admin: true},
  // User with Google provider.
  providerData: [{
    uid: 'google-uid',
    email: 'johndoe@gmail.com',
    displayName: 'John Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    providerId: 'google.com'
  }],
  multiFactor: {
    enrolledFactors: [
      // 2FA with SMS as 2nd factor.
      {
        uid: '53HG4HG45HG8G04GJ40J4G3J',
        phoneNumber: '+16505551234',
        displayName: 'Work phone',
        enrollmentTime: 'Fri, 22 Sep 2017 01:49:58 GMT',
        factorId: 'phone',
      },
    ],
  },
};

Liệt kê người dùng

Mã bên dưới hiển thị cách liệt kê tất cả người dùng và kiểm tra xem họ có đăng ký yếu tố phụ hay không:

admin.auth().listUsers(1000, nextPageToken)
  .then((listUsersResult) => {
    listUsersResult.users.forEach((userRecord) => {
      // Multi-factor enrolled users second factors can be retrieved via:
      if (userRecord.multiFactor) {
        userRecord.multiFactor.enrolledFactors.forEach((enrolledFactor) => {
          console.log(userRecord.uid, enrolledFactor.toJSON());
        });
      }
    });
  })
  .catch((error) => {
    console.log('Error listing users:', error);
  });

Người dùng được trả về theo đợt, sắp xếp theo uid của họ. Mỗi lô kết quả chứa danh sách người dùng và mã thông báo trang tiếp theo được sử dụng để tìm nạp lô tiếp theo. Khi tất cả người dùng đã được liệt kê, không có pageToken nào được trả lại.

Trường maxResult chỉ định kích thước lô tối đa. Giá trị mặc định và tối đa là 1000.

Tạo người dùng

Gọi createUser() để tạo người dùng mới. Người dùng mới có yếu tố phụ phải có địa chỉ email đã được xác minh (đặt emailVerified thành true ) và sử dụng yếu tố đầu tiên được hỗ trợ để đăng nhập. Cho phép tối đa 5 yếu tố phụ cho mỗi người dùng.

Ví dụ minh họa cách tạo người dùng mới với 2 yếu tố phụ:

admin.auth().createUser({
  uid: '123456789',
  email: 'user@example.com',
  emailVerified: true,
  password: 'password',
  multiFactor: {
    enrolledFactors: [
      // When creating users with phone second factors, the uid and
      // enrollmentTime should not be specified. These will be provisioned by
      // the Auth server.
      // Primary second factor.
      {
        phoneNumber: '+16505550001',
        displayName: 'Corp phone',
        factorId: 'phone',
      },
      // Backup second factor.
      {
        phoneNumber: '+16505550002',
        displayName: 'Personal phone',
        factorId: 'phone'
      },
    ],
  },
})
.then((userRecord) => {
  console.log(userRecord.multiFactor.enrolledFactors);
})
.catch((error) => {
  console.log(error);
});

Đang cập nhật người dùng

Để cập nhật người dùng hiện tại, hãy gọi updateUser() :

admin.auth().updateUser(uid: '123456789', {
  multiFactor: {
    enrolledFactors: [
      {
        // uid will be auto-generated.
        phoneNumber: '+16505550003',
        displayName: 'Spouse\'s phone',
        factorId: 'phone',
      },
      {
        // uid can also be specified. This is useful if a new second factor is added and an
        // existing enrolled second factor is kept unmodified.
        uid: 'existing-enrolled-mfa-uid',
        phoneNumber: '+16505550004',
        displayName: 'Personal phone',
        factorId: 'phone',
      },
      {
        phoneNumber: '+16505550005',
        displayName: 'Backup phone',
        factorId: 'phone',
        // Enrollment time can also be explicitly specified.
        enrollmentTime: new Date().toUTCString(),
      },
    ],
  },
})
.then((userRecord) => {
  console.log(userRecord.multiFactor.enrolledFactors);
})
.catch((error) => {
  console.log(error);
});

Thêm một yếu tố phụ mới

Gọi updateUser() với danh sách enrolledFactors sẽ xóa mọi yếu tố phụ hiện tại của người dùng. Để thêm hệ số phụ mới trong khi vẫn giữ nguyên các hệ số hiện có, trước tiên hãy tra cứu người dùng, sau đó thêm hệ số mới vào danh sách:

function enrollSecondFactor(userId, secondFactorPhoneNumber, secondFactorDisplayName) {
  return admin.auth().getUser(userId)
    .then((userRecord) => {
      const updatedList = (userRecord.multiFactor &&
        userRecord.multiFactor.toJSON().enrolledFactors) || [];
      updatedList.push({
        phoneNumber: secondFactorPhoneNumber,
        displayName: secondFactorDisplayName,
        factorId: 'phone',
      });
      return admin.auth().updateUser(userRecord.uid, {
        multiFactor: {
          enrolledFactors: updatedList,
        },
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

Loại bỏ yếu tố phụ

Để hủy đăng ký hoàn toàn một người dùng khỏi xác thực đa yếu tố, hãy đặt enrolledFactors thành null hoặc một mảng trống:

admin.auth().updateUser(uid: '123456789', {
  multiFactor: {
    enrolledFactors: null,
  },
})
.then((userRecord) => {
  console.log(userRecord.multiFactor);
})
.catch((error) => {
  console.log(error);
});