Quản lý người dùng

SDK của Firebase dành cho quản trị viên cung cấp một API để quản lý người dùng Firebase Authentication của bạn bằng các đặc quyền cấp cao. API quản lý người dùng quản trị cho phép bạn hoàn tất các nhiệm vụ sau theo phương thức lập trình trong một môi trường máy chủ bảo mật:

  • Tạo người dùng mới mà không bị điều tiết hoặc giới hạn tốc độ.
  • Tra cứu người dùng theo nhiều tiêu chí như uid, email hoặc số điện thoại.
  • Liệt kê tất cả người dùng của một dự án cụ thể theo lô.
  • Truy cập vào siêu dữ liệu của người dùng, bao gồm cả ngày tạo tài khoản và ngày đăng nhập gần đây nhất.
  • Xoá người dùng mà không cần mật khẩu hiện tại của họ.
  • Cập nhật thuộc tính người dùng (bao gồm cả mật khẩu) mà không cần đăng nhập bằng tài khoản của người dùng.
  • Xác minh email mà không cần phải thực hiện quy trình hành động ngoài băng tần để xác minh email.
  • Thay đổi email của người dùng mà không gửi đường liên kết qua email để thu hồi những thay đổi này.
  • Tạo người dùng mới bằng số điện thoại mà không cần phải thực hiện quy trình xác minh qua SMS.
  • Thay đổi số điện thoại của người dùng mà không cần thực hiện quy trình xác minh qua SMS.
  • Cấp phép người dùng ngoại tuyến ở trạng thái bị vô hiệu hoá, sau đó kiểm soát thời điểm bật người dùng.
  • Xây dựng bảng điều khiển tuỳ chỉnh cho người dùng, phù hợp với hệ thống quản lý người dùng của một ứng dụng cụ thể.

Trước khi bắt đầu

Để sử dụng API quản lý người dùng do SDK của Firebase dành cho quản trị viên cung cấp, bạn phải có tài khoản dịch vụ. Hãy làm theo hướng dẫn thiết lập để biết thêm thông tin về cách khởi động SDK dành cho quản trị viên.

Truy xuất dữ liệu người dùng

Cách chính để xác định người dùng là thông qua uid, một giá trị nhận dạng riêng biệt cho người dùng đó. SDK quản trị cung cấp một phương thức cho phép tìm nạp thông tin hồ sơ của người dùng theo uid của họ:

Node.js

getAuth()
  .getUser(uid)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

UserRecord userRecord = FirebaseAuth.getInstance().getUser(uid);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getUid());

Python

from firebase_admin import auth

user = auth.get_user(uid)
print(f'Successfully fetched user data: {user.uid}')

Bắt đầu

// Get an auth client from the firebase.App
client, err := app.Auth(ctx)
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

u, err := client.GetUser(ctx, uid)
if err != nil {
	log.Fatalf("error getting user %s: %v\n", uid, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserAsync(uid);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Phương thức này trả về một đối tượng UserRecord cho người dùng tương ứng với uid được cung cấp cho phương thức.

Nếu uid được cung cấp không thuộc về người dùng hiện tại hoặc không thể tìm nạp người dùng vì bất kỳ lý do nào khác, thì phương thức nêu trên sẽ gửi một lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi API xác thực của quản trị viên.

Trong một số trường hợp, bạn sẽ có email của người dùng thay vì uid của họ. SDK của Firebase dành cho quản trị viên hỗ trợ việc tra cứu thông tin người dùng bằng email:

Node.js

getAuth()
  .getUserByEmail(email)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getEmail());

Python

from firebase_admin import auth

user = auth.get_user_by_email(email)
print(f'Successfully fetched user data: {user.uid}')

Bắt đầu

u, err := client.GetUserByEmail(ctx, email)
if err != nil {
	log.Fatalf("error getting user by email %s: %v\n", email, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Phương thức này trả về một đối tượng UserRecord cho người dùng tương ứng với email được cung cấp.

Nếu email được cung cấp không thuộc về người dùng hiện tại hoặc không thể tìm nạp người dùng vì bất kỳ lý do nào khác, thì SDK dành cho quản trị viên sẽ gửi thông báo lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Trong các trường hợp khác, bạn sẽ có số điện thoại của người dùng thay vì uid của họ. SDK của Firebase dành cho quản trị viên hỗ trợ việc tra cứu thông tin người dùng bằng số điện thoại:

Node.js

getAuth()
  .getUserByPhoneNumber(phoneNumber)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data:  ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

UserRecord userRecord = FirebaseAuth.getInstance().getUserByPhoneNumber(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getPhoneNumber());

Python

from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print(f'Successfully fetched user data: {user.uid}')

Bắt đầu

u, err := client.GetUserByPhoneNumber(ctx, phone)
if err != nil {
	log.Fatalf("error getting user by phone %s: %v\n", phone, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Phương thức này trả về một đối tượng UserRecord cho người dùng tương ứng với số điện thoại được cung cấp.

Nếu số điện thoại được cung cấp không thuộc về người dùng hiện tại hoặc không thể tìm nạp người dùng vì bất kỳ lý do nào khác, thì SDK dành cho quản trị viên sẽ gửi một lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Truy xuất hàng loạt dữ liệu người dùng

SDK của Firebase dành cho quản trị viên cũng cho phép truy xuất danh sách người dùng dựa trên giá trị nhận dạng mà bạn cung cấp. Bạn có thể xác định người dùng bằng mã nhận dạng người dùng, email hoặc số điện thoại của họ. Bạn có thể cung cấp tối đa 100 giá trị nhận dạng trong một lệnh gọi. Giá trị nhận dạng có thể chứa nhiều loại:

Node.js

getAuth()
  .getUsers([
    { uid: 'uid1' },
    { email: 'user2@example.com' },
    { phoneNumber: '+15555550003' },
    { providerId: 'google.com', providerUid: 'google_uid4' },
  ])
  .then((getUsersResult) => {
    console.log('Successfully fetched user data:');
    getUsersResult.users.forEach((userRecord) => {
      console.log(userRecord);
    });

    console.log('Unable to find users corresponding to these identifiers:');
    getUsersResult.notFound.forEach((userIdentifier) => {
      console.log(userIdentifier);
    });
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

GetUsersResult result = FirebaseAuth.getInstance().getUsersAsync(Arrays.asList(
    new UidIdentifier("uid1"),
    new EmailIdentifier("user2@example.com"),
    new PhoneIdentifier("+15555550003"),
    new ProviderIdentifier("google.com", "google_uid4"))).get();

System.out.println("Successfully fetched user data:");
for (UserRecord user : result.getUsers()) {
  System.out.println(user.getUid());
}

System.out.println("Unable to find users corresponding to these identifiers:");
for (UserIdentifier uid : result.getNotFound()) {
  System.out.println(uid);
}

Python

from firebase_admin import auth

result = auth.get_users([
    auth.UidIdentifier('uid1'),
    auth.EmailIdentifier('user2@example.com'),
    auth.PhoneIdentifier(+15555550003),
    auth.ProviderIdentifier('google.com', 'google_uid4')
])

print('Successfully fetched user data:')
for user in result.users:
    print(user.uid)

print('Unable to find users corresponding to these identifiers:')
for uid in result.not_found:
    print(uid)

Bắt đầu

getUsersResult, err := client.GetUsers(ctx, []auth.UserIdentifier{
	auth.UIDIdentifier{UID: "uid1"},
	auth.EmailIdentifier{Email: "user@example.com"},
	auth.PhoneIdentifier{PhoneNumber: "+15555551234"},
	auth.ProviderIdentifier{ProviderID: "google.com", ProviderUID: "google_uid1"},
})
if err != nil {
	log.Fatalf("error retriving multiple users: %v\n", err)
}

log.Printf("Successfully fetched user data:")
for _, u := range getUsersResult.Users {
	log.Printf("%v", u)
}

log.Printf("Unable to find users corresponding to these identifiers:")
for _, id := range getUsersResult.NotFound {
	log.Printf("%v", id)
}

C#

GetUsersResult result = await FirebaseAuth.DefaultInstance.GetUsersAsync(
    new List<UserIdentifier>
    {
        new UidIdentifier("uid1"),
        new EmailIdentifier("user2@example.com"),
        new PhoneIdentifier("+15555550003"),
        new ProviderIdentifier("google.com", "google_uid4"),
    });

Console.WriteLine("Successfully fetched user data:");
foreach (UserRecord user in result.Users)
{
    Console.WriteLine($"User: {user.Uid}");
}

Console.WriteLine("Unable to find users corresponding to these identifiers:");
foreach (UserIdentifier uid in result.NotFound)
{
    Console.WriteLine($"{uid}");
}

Phương thức này trả về một danh sách có cùng kích thước với danh sách đầu vào, trong đó mỗi mục nhập chứa UserRecord tương ứng hoặc lỗi cho biết lý do không thể tra cứu giá trị nhận dạng đó. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Tạo người dùng

SDK dành cho quản trị viên cung cấp một phương thức cho phép bạn tạo người dùng Firebase Authentication mới. Phương thức này chấp nhận một đối tượng chứa thông tin hồ sơ để đưa vào tài khoản người dùng mới tạo:

Node.js

getAuth()
  .createUser({
    email: 'user@example.com',
    emailVerified: false,
    phoneNumber: '+11234567890',
    password: 'secretPassword',
    displayName: 'John Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: false,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

Java

CreateRequest request = new CreateRequest()
    .setEmail("user@example.com")
    .setEmailVerified(false)
    .setPassword("secretPassword")
    .setPhoneNumber("+11234567890")
    .setDisplayName("John Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(false);

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

Python

user = auth.create_user(
    email='user@example.com',
    email_verified=False,
    phone_number='+15555550100',
    password='secretPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=False)
print(f'Sucessfully created new user: {user.uid}')

Bắt đầu

params := (&auth.UserToCreate{}).
	Email("user@example.com").
	EmailVerified(false).
	PhoneNumber("+15555550100").
	Password("secretPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(false)
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Email = "user@example.com",
    EmailVerified = false,
    PhoneNumber = "+11234567890",
    Password = "secretPassword",
    DisplayName = "John Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = false,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

Theo mặc định, Firebase Authentication sẽ tạo một uid ngẫu nhiên cho người dùng mới. Nếu muốn chỉ định uid của riêng mình cho người dùng mới, bạn có thể đưa đó vào dưới dạng đối số được truyền đến phương thức tạo người dùng:

Node.js

getAuth()
  .createUser({
    uid: 'some-uid',
    email: 'user@example.com',
    phoneNumber: '+11234567890',
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

Java

CreateRequest request = new CreateRequest()
    .setUid("some-uid")
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890");

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

Python

user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print(f'Sucessfully created new user: {user.uid}')

Bắt đầu

params := (&auth.UserToCreate{}).
	UID(uid).
	Email("user@example.com").
	PhoneNumber("+15555550100")
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = "some-uid",
    Email = "user@example.com",
    PhoneNumber = "+11234567890",
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

Bạn có thể cung cấp bất kỳ tổ hợp thuộc tính nào sau đây:

Bảng 1. Các thuộc tính được hỗ trợ trong thao tác tạo người dùng

Tài sản Loại Mô tả
uid chuỗi uid để chỉ định cho người dùng mới tạo. Phải là một chuỗi dài từ 1 đến 128 ký tự. Nếu không được cung cấp, một uid ngẫu nhiên sẽ được tạo tự động. uid ngắn hơn sẽ mang lại hiệu suất tốt hơn.
email chuỗi Email chính của người dùng. Phải là địa chỉ email hợp lệ.
emailVerified boolean Email chính của người dùng đã được xác minh hay chưa. Nếu bạn không cung cấp, giá trị mặc định sẽ là false.
phoneNumber chuỗi Số điện thoại chính của người dùng. Phải là số điện thoại hợp lệ tuân thủ quy cách E.164.
password chuỗi Mật khẩu thô, chưa băm của người dùng. Phải dài ít nhất 6 ký tự.
displayName chuỗi Tên hiển thị của người dùng.
photoURL chuỗi URL ảnh của người dùng.
disabled boolean Người dùng có bị vô hiệu hoá hay không. true để tắt; false để bật. Nếu bạn không cung cấp, giá trị mặc định sẽ là false.

Phương thức tạo người dùng sẽ trả về một đối tượng UserRecord cho người dùng mới tạo.

Nếu uid, email hoặc số điện thoại được cung cấp đã được một người dùng hiện tại sử dụng hoặc không thể tạo người dùng vì bất kỳ lý do nào khác, thì phương thức trên sẽ không thành công và báo lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Cập nhật người dùng

SDK của Firebase dành cho quản trị viên hỗ trợ việc sửa đổi dữ liệu của người dùng hiện tại. Bạn cần chỉ định một uid cùng với các thuộc tính cần cập nhật cho người dùng đó:

Node.js

getAuth()
  .updateUser(uid, {
    email: 'modifiedUser@example.com',
    phoneNumber: '+11234567890',
    emailVerified: true,
    password: 'newPassword',
    displayName: 'Jane Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: true,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully updated user', userRecord.toJSON());
  })
  .catch((error) => {
    console.log('Error updating user:', error);
  });

Java

UpdateRequest request = new UpdateRequest(uid)
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890")
    .setEmailVerified(true)
    .setPassword("newPassword")
    .setDisplayName("Jane Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(true);

UserRecord userRecord = FirebaseAuth.getInstance().updateUser(request);
System.out.println("Successfully updated user: " + userRecord.getUid());

Python

user = auth.update_user(
    uid,
    email='user@example.com',
    phone_number='+15555550100',
    email_verified=True,
    password='newPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=True)
print(f'Sucessfully updated user: {user.uid}')

Bắt đầu

params := (&auth.UserToUpdate{}).
	Email("user@example.com").
	EmailVerified(true).
	PhoneNumber("+15555550100").
	Password("newPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(true)
u, err := client.UpdateUser(ctx, uid, params)
if err != nil {
	log.Fatalf("error updating user: %v\n", err)
}
log.Printf("Successfully updated user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = uid,
    Email = "modifiedUser@example.com",
    PhoneNumber = "+11234567890",
    EmailVerified = true,
    Password = "newPassword",
    DisplayName = "Jane Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = true,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.UpdateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully updated user: {userRecord.Uid}");

Bạn có thể cung cấp bất kỳ tổ hợp thuộc tính nào sau đây:

Bảng 2. Các thuộc tính được hỗ trợ trong thao tác cập nhật người dùng

Tài sản Loại Mô tả
email chuỗi Email chính mới của người dùng. Phải là địa chỉ email hợp lệ.
emailVerified boolean Email chính của người dùng đã được xác minh hay chưa. Nếu bạn không cung cấp, giá trị mặc định sẽ là false.
phoneNumber string | null Số điện thoại chính mới của người dùng. Phải là số điện thoại hợp lệ tuân thủ quy cách E.164. Đặt thành null để xoá số điện thoại hiện có của người dùng.
password chuỗi Mật khẩu mới, chưa băm của người dùng. Phải dài ít nhất 6 ký tự.
displayName string | null Tên hiển thị mới của người dùng. Đặt thành null để xoá tên hiển thị hiện có của người dùng.
photoURL string | null URL ảnh mới của người dùng. Đặt thành null để xoá URL ảnh hiện có của người dùng. Nếu không phải là null, thì phải là một URL hợp lệ.
disabled boolean Người dùng có bị vô hiệu hoá hay không. true để tắt; false để bật.

Phương thức cập nhật người dùng sẽ trả về một đối tượng UserRecord đã cập nhật khi quá trình cập nhật hoàn tất thành công.

Nếu uid được cung cấp không tương ứng với người dùng hiện tại, email hoặc số điện thoại được cung cấp đã được người dùng hiện tại sử dụng hoặc không thể cập nhật người dùng vì bất kỳ lý do nào khác, thì phương thức trên sẽ không thành công và xảy ra lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Xóa người dùng

SDK của Firebase dành cho quản trị viên cho phép xoá người dùng hiện có bằng uid của họ:

Node.js

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });

Java

FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");

Python

auth.delete_user(uid)
print('Successfully deleted user')

Bắt đầu

err := client.DeleteUser(ctx, uid)
if err != nil {
	log.Fatalf("error deleting user: %v\n", err)
}
log.Printf("Successfully deleted user: %s\n", uid)

C#

await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

Phương thức xoá người dùng sẽ trả về kết quả trống khi quá trình xoá hoàn tất thành công.

Nếu uid được cung cấp không tương ứng với người dùng hiện tại hoặc không thể xoá người dùng vì bất kỳ lý do nào khác, thì phương thức xoá người dùng sẽ gửi một lỗi. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Xoá nhiều người dùng

SDK của Firebase dành cho quản trị viên cũng có thể xoá nhiều người dùng cùng một lúc. Tuy nhiên, xin lưu ý rằng việc sử dụng các phương thức như deleteUsers(uids) để xoá nhiều người dùng cùng một lúc sẽ không kích hoạt trình xử lý sự kiện onDelete() cho Cloud Functions for Firebase. Điều này là do thao tác xoá hàng loạt không kích hoạt sự kiện xoá người dùng đối với từng người dùng. Xoá từng người dùng một nếu bạn muốn kích hoạt sự kiện xoá người dùng cho từng người dùng bị xoá.

Node.js

getAuth()
  .deleteUsers([uid1, uid2, uid3])
  .then((deleteUsersResult) => {
    console.log(`Successfully deleted ${deleteUsersResult.successCount} users`);
    console.log(`Failed to delete ${deleteUsersResult.failureCount} users`);
    deleteUsersResult.errors.forEach((err) => {
      console.log(err.error.toJSON());
    });
  })
  .catch((error) => {
    console.log('Error deleting users:', error);
  });

Java

DeleteUsersResult result = FirebaseAuth.getInstance().deleteUsersAsync(
    Arrays.asList("uid1", "uid2", "uid3")).get();

System.out.println("Successfully deleted " + result.getSuccessCount() + " users");
System.out.println("Failed to delete " + result.getFailureCount() + " users");
for (ErrorInfo error : result.getErrors()) {
  System.out.println("error #" + error.getIndex() + ", reason: " + error.getReason());
}

Python

from firebase_admin import auth

result = auth.delete_users(["uid1", "uid2", "uid3"])

print(f'Successfully deleted {result.success_count} users')
print(f'Failed to delete {result.failure_count} users')
for err in result.errors:
    print(f'error #{result.index}, reason: {result.reason}')

Bắt đầu

deleteUsersResult, err := client.DeleteUsers(ctx, []string{"uid1", "uid2", "uid3"})
if err != nil {
	log.Fatalf("error deleting users: %v\n", err)
}

log.Printf("Successfully deleted %d users", deleteUsersResult.SuccessCount)
log.Printf("Failed to delete %d users", deleteUsersResult.FailureCount)
for _, err := range deleteUsersResult.Errors {
	log.Printf("%v", err)
}

C#

DeleteUsersResult result = await FirebaseAuth.DefaultInstance.DeleteUsersAsync(new List<string>
    {
        "uid1",
        "uid2",
        "uid3",
    });

Console.WriteLine($"Successfully deleted {result.SuccessCount} users.");
Console.WriteLine($"Failed to delete {result.FailureCount} users.");

foreach (ErrorInfo err in result.Errors)
{
    Console.WriteLine($"Error #{err.Index}, reason: {err.Reason}");
}

Phương thức xoá người dùng sẽ trả về danh sách các lỗi đối với những người dùng không thể xoá. Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Liệt kê tất cả người dùng

SDK của Firebase dành cho quản trị viên cho phép truy xuất toàn bộ danh sách người dùng theo lô:

Node.js

const listAllUsers = (nextPageToken) => {
  // List batch of users, 1000 at a time.
  getAuth()
    .listUsers(1000, nextPageToken)
    .then((listUsersResult) => {
      listUsersResult.users.forEach((userRecord) => {
        console.log('user', userRecord.toJSON());
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch((error) => {
      console.log('Error listing users:', error);
    });
};
// Start listing users from the beginning, 1000 at a time.
listAllUsers();

Java

// Start listing users from the beginning, 1000 at a time.
ListUsersPage page = FirebaseAuth.getInstance().listUsers(null);
while (page != null) {
  for (ExportedUserRecord user : page.getValues()) {
    System.out.println("User: " + user.getUid());
  }
  page = page.getNextPage();
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
page = FirebaseAuth.getInstance().listUsers(null);
for (ExportedUserRecord user : page.iterateAll()) {
  System.out.println("User: " + user.getUid());
}

Python

# Start listing users from the beginning, 1000 at a time.
page = auth.list_users()
while page:
    for user in page.users:
        print('User: ' + user.uid)
    # Get next batch of users.
    page = page.get_next_page()

# Iterate through all users. This will still retrieve users in batches,
# buffering no more than 1000 users in memory at a time.
for user in auth.list_users().iterate_all():
    print('User: ' + user.uid)

Bắt đầu

// Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API
iter := client.Users(ctx, "")
for {
	user, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		log.Fatalf("error listing users: %s\n", err)
	}
	log.Printf("read user user: %v\n", user)
}

// Iterating by pages 100 users at a time.
// Note that using both the Next() function on an iterator and the NextPage()
// on a Pager wrapping that same iterator will result in an error.
pager := iterator.NewPager(client.Users(ctx, ""), 100, "")
for {
	var users []*auth.ExportedUserRecord
	nextPageToken, err := pager.NextPage(&users)
	if err != nil {
		log.Fatalf("paging error %v\n", err)
	}
	for _, u := range users {
		log.Printf("read user user: %v\n", u)
	}
	if nextPageToken == "" {
		break
	}
}

C#

// Start listing users from the beginning, 1000 at a time.
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (await responses.MoveNextAsync())
{
    ExportedUserRecords response = responses.Current;
    foreach (ExportedUserRecord user in response.Users)
    {
        Console.WriteLine($"User: {user.Uid}");
    }
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
var enumerator = FirebaseAuth.DefaultInstance.ListUsersAsync(null).GetAsyncEnumerator();
while (await enumerator.MoveNextAsync())
{
    ExportedUserRecord user = enumerator.Current;
    Console.WriteLine($"User: {user.Uid}");
}

Mỗi lô kết quả chứa một danh sách người dùng và mã thông báo trang tiếp theo dùng để liệt kê lô người dùng tiếp theo. Khi tất cả người dùng đã được liệt kê, hệ thống sẽ không trả về pageToken.

Nếu bạn không chỉ định trường maxResults, thì hệ thống sẽ sử dụng giá trị mặc định là 1.000 người dùng cho mỗi lô. Đây cũng là số lượng người dùng tối đa được phép liệt kê cùng một lúc. Mọi giá trị lớn hơn giá trị tối đa sẽ gửi lỗi đối số. Nếu không có pageToken nào được chỉ định, thao tác này sẽ liệt kê người dùng từ đầu, được sắp xếp theo uid.

Để xem danh sách đầy đủ các mã lỗi, bao gồm cả nội dung mô tả và các bước giải quyết, hãy xem bài viết Lỗi Authentication API Quản trị.

Hàm băm mật khẩu của người dùng trong danh sách

API này cũng trả về passwordSalt và passwordHash được băm bằng phần phụ trợ của Firebase Auth cho người dùng mật khẩu nếu tài khoản người dùng/dịch vụ dùng để tạo mã truy cập OAuth của yêu cầu có quyền firebaseauth.configs.getHashConfig. Nếu không, passwordHash và passwordSalt sẽ không được đặt.

Do tính chất nhạy cảm của hàm băm mật khẩu, tài khoản dịch vụ SDK của Firebase dành cho quản trị viên không có quyền firebaseauth.configs.getHashConfig theo mặc định. Bạn không thể thêm trực tiếp quyền vào tài khoản người dùng/dịch vụ, nhưng có thể làm việc này một cách gián tiếp bằng cách tạo vai trò IAM tuỳ chỉnh.

Cách tạo vai trò IAM tuỳ chỉnh:

  1. Chuyển đến trang Roles (Vai trò) trong bảng điều khiển IAM & admin (IAM và quản trị viên) trong bảng điều khiển Google Cloud.
  2. Chọn dự án của bạn trong trình đơn thả xuống ở đầu trang.
  3. Nhấp vào TẠO VAI TRÒ
  4. Nhấp vào THÊM QUYỀN
  5. Tìm quyền firebaseauth.configs.getHashConfig rồi chọn hộp đánh dấu đó.
  6. Nhấp vào THÊM
  7. Nhấp vào CREATE (TẠO) để hoàn tất việc tạo vai trò mới.

Thêm vai trò tuỳ chỉnh đã tạo vào tài khoản người dùng/dịch vụ trên trang IAM:

  1. Trong bảng điều khiển IAM & admin (IAM và quản trị viên), hãy chọn IAM
  2. Chọn dịch vụ hoặc tài khoản người dùng trong danh sách thành viên để chỉnh sửa.
  3. Nhấp vào THÊM VAI TRÒ KHÁC.
  4. Tìm vai trò tuỳ chỉnh mới đã tạo trước đó.
  5. Nhấp vào LƯU.