Kelola Pengguna

Firebase Admin SDK menyediakan API untuk mengelola pengguna Firebase Authentication dengan hak istimewa yang ditingkatkan. Dengan API pengelolaan pengguna admin, Anda dapat menyelesaikan tugas-tugas berikut secara terprogram dari lingkungan server yang aman:

  • Membuat pengguna baru tanpa throttling atau pembatasan kapasitas.
  • Mencari pengguna berdasarkan kriteria yang berbeda, seperti uid, email, atau nomor telepon.
  • Menampilkan daftar semua pengguna project tertentu dalam batch.
  • Mengakses metadata pengguna, termasuk tanggal pembuatan akun dan tanggal terakhir login.
  • Menghapus pengguna tanpa memerlukan sandi mereka.
  • Memperbarui properti pengguna, termasuk sandi mereka, tanpa harus login sebagai pengguna.
  • Melakukan verifikasi email tanpa harus melalui alur tindakan yang tidak umum untuk melakukan verifikasi.
  • Mengubah email pengguna tanpa mengirim link email untuk membatalkan perubahan ini.
  • Membuat pengguna baru dengan nomor telepon tanpa harus melalui alur verifikasi SMS.
  • Mengubah nomor telepon pengguna tanpa harus melalui alur verifikasi SMS.
  • Melakukan penyediaan offline untuk pengguna dalam keadaan nonaktif, kemudian mengontrol kapan mengaktifkannya.
  • Mem-build konsol pengguna khusus yang disesuaikan dengan sistem pengelolaan pengguna aplikasi tertentu.

Sebelum memulai

Untuk menggunakan API pengelolaan pengguna yang disediakan oleh Firebase Admin SDK, Anda harus memiliki akun layanan. Ikuti petunjuk penyiapan untuk mengetahui informasi lebih lanjut cara menginisialisasi Admin SDK.

Mengambil data pengguna

Cara utama untuk mengidentifikasi pengguna adalah melalui uid-nya, yaitu ID unik bagi pengguna tersebut. Admin SDK menyediakan metode yang memungkinkan pengambilan informasi profil pengguna dengan uid mereka:

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('Successfully fetched user data: {0}'.format(user.uid))

Go

// 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}");

Metode ini menampilkan objek UserRecord untuk pengguna yang sesuai dengan uid yang diberikan pada metode tersebut.

Jika uid yang diberikan bukan milik pengguna yang sudah ada atau data pengguna tidak dapat diambil karena alasan lain, metode di atas akan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaiannya, lihat Error pada Admin Authentication API.

Dalam beberapa kasus, Anda hanya memiliki informasi email pengguna, bukan uid mereka. Firebase Admin SDK mendukung pencarian informasi pengguna dengan 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('Successfully fetched user data: {0}'.format(user.uid))

Go

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

Metode ini menampilkan objek UserRecord untuk pengguna yang sesuai dengan email yang diberikan.

Jika email yang diberikan bukan milik pengguna yang sudah ada atau data pengguna tidak dapat diambil karena alasan lain, Admin SDK akan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Dalam kasus lain, Anda akan memiliki nomor telepon pengguna, bukan uid mereka. Firebase Admin SDK mendukung pencarian informasi pengguna dengan nomor telepon:

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('Successfully fetched user data: {0}'.format(user.uid))

Go

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

Metode ini menampilkan objek UserRecord untuk pengguna yang sesuai dengan nomor telepon yang diberikan.

Jika nomor telepon yang diberikan bukan milik pengguna yang sudah ada atau data pengguna tidak dapat diambil karena alasan lain, Admin SDK akan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Mengambil data pengguna secara massal

Firebase Admin SDK juga dapat digunakan untuk mengambil daftar pengguna berdasarkan ID yang Anda berikan. Anda dapat mengidentifikasi pengguna dengan ID pengguna, email, atau nomor telepon. Maksimum 100 ID dapat diberikan dalam satu panggilan. ID dapat berisi gabungan berbagai jenis:

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)

Go

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

Metode ini akan menampilkan daftar dengan ukuran yang sama seperti daftar input, dengan setiap entri yang berisi UserRecord terkait atau error yang menunjukkan penyebab ID tidak dapat dicari. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Membuat pengguna

Admin SDK menyediakan metode yang memungkinkan Anda membuat pengguna Firebase Authentication baru. Metode ini menerima objek yang berisi informasi profil untuk disertakan dalam akun pengguna yang baru dibuat:

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('Sucessfully created new user: {0}'.format(user.uid))

Go

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

Secara default, Firebase Authentication akan membuat uid acak untuk pengguna baru. Namun, jika Anda ingin menetapkan uid sendiri untuk pengguna baru, Anda dapat menyertakannya sebagai argumen yang diteruskan ke metode pembuatan pengguna:

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('Sucessfully created new user: {0}'.format(user.uid))

Go

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

Kombinasi dari properti berikut ini dapat diberikan:

Tabel 1. Properti yang didukung oleh operasi pembuatan pengguna

Properti Jenis Deskripsi
uid string uid yang akan ditentukan ke pengguna yang baru dibuat. Harus dalam bentuk string dengan panjang karakter antara 1-128, inklusif. Jika tidak diberikan, uid acak akan dibuat secara otomatis. uid yang lebih singkat menawarkan performa yang lebih baik.
email string Email utama pengguna. Harus berupa alamat email yang valid.
emailVerified boolean Apakah email utama pengguna telah diverifikasi atau belum. Jika tidak diberikan, defaultnya adalah false.
phoneNumber string Nomor telepon utama pengguna. Harus berupa nomor telepon sesuai spesifikasi E.164 yang valid.
password string Sandi pengguna yang masih mentah dan belum di-hash. Minimal harus berisi 6 karakter.
displayName string Nama tampilan pengguna.
photoURL string URL foto pengguna.
disabled boolean Apakah pengguna dinonaktifkan atau tidak. true jika dinonaktifkan; dan false jika diaktifkan. Jika tidak diberikan, defaultnya adalah false.

Metode pembuatan pengguna menampilkan objek UserRecord untuk pengguna yang baru dibuat.

Jika uid, email, atau nomor telepon yang diberikan telah digunakan oleh pengguna yang sudah ada atau pengguna tidak dapat dibuat karena alasan lain, metode di atas akan gagal dan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Memperbarui data pengguna

Anda dapat menggunakan Firebase Admin SDK untuk mengubah data pengguna yang sudah ada. Anda perlu menentukan uid beserta properti yang akan diperbarui untuk pengguna tersebut:

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('Sucessfully updated user: {0}'.format(user.uid))

Go

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

Kombinasi dari properti berikut ini dapat diberikan:

Tabel 2. Properti yang didukung oleh operasi pembaruan data pengguna

Properti Jenis Deskripsi
email string Email utama baru milik pengguna. Harus berupa alamat email yang valid.
emailVerified boolean Apakah email utama pengguna telah diverifikasi atau belum. Jika tidak diberikan, defaultnya adalah false.
phoneNumber string Nomor telepon utama baru pengguna. Harus berupa nomor telepon sesuai spesifikasi E.164 yang valid. Setel ke null untuk menghapus nomor telepon pengguna yang sudah ada.
password string Sandi baru pengguna yang masih mentah dan belum di-hash. Minimal harus berisi 6 karakter.
displayName string | null Nama tampilan baru pengguna. Setel ke null untuk menghapus nama tampilan pengguna yang ada.
photoURL string | null URL foto baru pengguna. Setel ke null untuk menghapus URL foto pengguna yang ada. Jika bukan null, maka harus berupa URL yang valid.
disabled boolean Apakah pengguna dinonaktifkan atau tidak. true jika dinonaktifkan; dan false jika diaktifkan.

Metode pembaruan data pengguna akan menampilkan objek UserRecord yang diperbarui saat pembaruan berhasil dilakukan.

Jika uid yang diberikan tidak sesuai dengan pengguna yang sudah ada, email atau nomor telepon yang diberikan telah digunakan oleh pengguna yang sudah ada, atau pengguna tidak dapat diperbarui karena alasan lain, metode di atas akan gagal dengan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Menghapus pengguna

Dengan Firebase Admin SDK, pengguna yang sudah ada dapat dihapus melalui uid mereka:

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')

Go

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.");

Metode penghapusan pengguna akan menampilkan hasil kosong ketika penghapusan berhasil dilakukan.

Jika uid yang diberikan tidak sesuai dengan pengguna yang sudah ada atau pengguna tidak dapat dihapus karena alasan lain, metode penghapusan pengguna ini akan menampilkan error. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Menghapus Beberapa Pengguna

Firebase Admin SDK juga dapat menghapus beberapa pengguna sekaligus. Namun, perlu diperhatikan bahwa menggunakan metode seperti deleteUsers(uids) untuk menghapus beberapa pengguna sekaligus tidak akan memicu pengendali peristiwa onDelete() untuk Cloud Functions for Firebase. Hal ini karena penghapusan dalam batch tidak memicu peristiwa penghapusan pengguna pada setiap pengguna. Hapus pengguna satu per satu jika Anda ingin peristiwa penghapusan pengguna diaktifkan untuk setiap pengguna yang dihapus.

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('Successfully deleted {0} users'.format(result.success_count))
print('Failed to delete {0} users'.format(result.failure_count))
for err in result.errors:
    print('error #{0}, reason: {1}'.format(result.index, result.reason))

Go

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

Metode penghapusan pengguna akan menampilkan daftar kegagalan untuk pengguna yang tidak dapat dihapus. Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Menampilkan daftar semua pengguna

Firebase Admin SDK memungkinkan pengambilan daftar semua pengguna dalam batch:

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)

Go

// 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}");
}

Setiap batch hasil berisi daftar pengguna dan token halaman berikutnya yang digunakan untuk menampilkan daftar pengguna dalam batch berikutnya. Setelah semua pengguna sudah tercantum, tidak ada pageToken yang ditampilkan.

Jika kolom maxResults tidak ditentukan, nilai default 1.000 pengguna per batch akan digunakan. Angka ini juga menunjukkan jumlah maksimum pengguna yang diizinkan untuk dicantumkan pada satu waktu. Setiap nilai yang lebih besar daripada nilai maksimum akan menampilkan error argumen. Jika pageToken tidak ditentukan, operasi akan mencantumkan pengguna dari awal, yang diurutkan berdasarkan uid.

Untuk mengetahui daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, baca bagian Error pada Admin Authentication API.

Hash sandi dari pengguna yang tercantum dalam daftar

API ini juga menampilkan passwordSalt dan passwordHash yang di-hash oleh backend Firebase Auth untuk pengguna sandi jika akun pengguna/layanan yang digunakan untuk membuat token akses OAuth permintaan memiliki izin firebaseauth.configs.getHashConfig. Jika tidak, passwordHash dan passwordSalt tidak akan ditetapkan.

Karena sifat hash sandi yang sensitif, akun layanan Firebase Admin SDK tidak memiliki izin firebaseauth.configs.getHashConfig secara default. Anda tidak dapat menambahkan izin secara langsung ke akun pengguna/layanan, tetapi Anda dapat melakukannya secara tidak langsung dengan membuat peran IAM khusus.

Untuk membuat peran IAM khusus:

  1. Buka halaman Peran di panel IAM & admin di Google Cloud console.
  2. Pilih project Anda dari drop-down di bagian atas halaman.
  3. Klik CREATE ROLE
  4. Klik ADD PERMISSIONS
  5. Telusuri izin firebaseauth.configs.getHashConfig dan pilih kotak centang tersebut.
  6. Klik ADD.
  7. Klik CREATE untuk menyelesaikan pembuatan peran baru.

Tambahkan peran khusus yang dibuat ke akun pengguna/layanan di halaman IAM:

  1. Pada panel IAM & admin, pilih IAM
  2. Pilih akun layanan atau pengguna dari daftar anggota yang akan diedit.
  3. Klik ADD ANOTHER ROLE.
  4. Telusuri peran khusus baru yang telah dibuat sebelumnya.
  5. Klik SIMPAN.