Firebase Admin SDK 提供 API,可讓您管理具有提升權限的使用者。Firebase Authentication管理員使用者管理 API 可讓您透過程式,在安全的伺服器環境中完成下列工作:
- 建立新使用者,不受任何節流或速率限制。
- 依據不同條件 (例如 UID、電子郵件或電話號碼) 查詢使用者。
- 分批列出指定專案的所有使用者。
- 存取使用者中繼資料,包括帳戶建立日期和上次登入日期。
- 刪除使用者時,不必輸入現有密碼。
- 更新使用者屬性 (包括密碼),不必以使用者身分登入。
- 驗證電子郵件,不必透過頻外動作流程驗證電子郵件。
- 變更使用者的電子郵件地址,不必傳送電子郵件連結來撤銷這些變更。
- 建立新使用者並提供電話號碼,不必經過簡訊驗證流程。
- 變更使用者的電話號碼,不必經過簡訊驗證流程。
- 離線佈建使用者,並將其設為停用狀態,之後再控制啟用時間。
- 建構自訂使用者控制台,配合特定應用程式的使用者管理系統。
事前準備
如要使用 Firebase Admin SDK 提供的使用者管理 API,您必須擁有服務帳戶。請按照設定操作說明初始化 Admin SDK。
擷取使用者資料
識別使用者的主要方式是透過uid,這是使用者的專屬 ID。Admin SDK 提供的方法可讓您依 uid 擷取使用者個人資料資訊:
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}')
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}");
這個方法會針對提供給方法的 uid,傳回對應使用者的 UserRecord 物件。
如果提供的 uid 不屬於現有使用者,或因任何其他原因無法擷取使用者,上述方法就會擲回錯誤。
如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Auth API 錯誤」。
有時您會取得使用者的電子郵件地址,而非 uid。Firebase Admin SDK 支援使用電子郵件地址查詢使用者資訊:
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}')
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}");
這個方法會傳回與所提供電子郵件地址相符的使用者 UserRecord 物件。
如果提供的電子郵件不屬於現有使用者,或因任何其他原因無法擷取使用者,Admin SDK 會擲回錯誤。如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Authentication API 錯誤」。
在其他情況下,您會看到使用者的電話號碼,而非 uid。Firebase Admin SDK 支援使用電話號碼查詢使用者資訊:
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}')
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}");
這個方法會針對提供的電話號碼,傳回對應使用者的 UserRecord 物件。
如果提供的電話號碼不屬於現有使用者,或因任何其他原因無法擷取使用者,Admin SDK 會擲回錯誤。如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Authentication API 錯誤」。
大量擷取使用者資料
Firebase Admin SDK 也可根據您提供的 ID 擷取使用者清單。您可以透過使用者 ID、電子郵件地址或電話號碼識別使用者。單次呼叫最多可提供 100 個 ID。 ID 可包含多種類型:
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}");
}
這個方法會傳回與輸入清單大小相同的清單,其中每個項目都包含對應的 UserRecord,或是指出無法查閱該 ID 的錯誤。如需錯誤代碼的完整清單,包括說明和解決步驟,請參閱「Admin Authentication API 錯誤」。
新增使用者
Admin SDK 提供的方法可讓您建立新的 Firebase Authentication 使用者。這個方法會接受物件,其中包含要納入新建立使用者帳戶的個人資料資訊:
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}')
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}");
根據預設,Firebase Authentication 會為新使用者產生隨機 uid。如要為新使用者指定 uid,可以將其做為引數傳遞至使用者建立方法:
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}')
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}");
您可以提供下列屬性的任意組合:
表 1. 建立使用者作業支援的屬性
| 屬性 | 類型 | 說明 | 
|---|---|---|
| uid | 字串 | 指派給新建立使用者的 uid。必須是長度介於 1 到 128 個字元 (含) 的字串。如未提供,系統會自動產生隨機uid。較短的目標可帶來更出色的成效。uid | 
| email | 字串 | 使用者的主要電子郵件地址。請輸入有效的電子郵件地址。 | 
| emailVerified | 布林值 | 使用者的主要電子郵件地址是否已通過驗證。如未提供,則預設為 false。 | 
| phoneNumber | 字串 | 使用者的主要電話號碼。必須是符合 E.164 規格的有效電話號碼。 | 
| password | 字串 | 使用者的原始密碼 (未經過雜湊處理)。長度不得少於六個字元。 | 
| displayName | 字串 | 使用者的顯示名稱。 | 
| photoURL | 字串 | 使用者的相片網址。 | 
| disabled | 布林值 | 使用者是否已停用。 true(已停用);false(已啟用)。如未提供,預設值為false。 | 
使用者建立方法會傳回新建立使用者的 UserRecord 物件。
如果現有使用者已使用提供的 uid、電子郵件或電話號碼,或因任何其他原因無法建立使用者,上述方法就會失敗並傳回錯誤。如需錯誤代碼的完整清單,包括說明和解決步驟,請參閱「Admin Authentication API 錯誤」。
更新使用者
Firebase Admin SDK 可協助您修改現有使用者的資料。您需要指定 uid,以及要為該使用者更新的屬性:
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}')
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}");
您可以提供下列屬性的任意組合:
表 2. 更新使用者作業支援的屬性
| 屬性 | 類型 | 說明 | 
|---|---|---|
| email | 字串 | 使用者的新主要電子郵件地址。請輸入有效的電子郵件地址。 | 
| emailVerified | 布林值 | 使用者的主要電子郵件地址是否已通過驗證。如未提供,則預設為 false。 | 
| phoneNumber | 字串 | null | 使用者的新主要電話號碼。必須是符合 E.164 規格的有效電話號碼。設為 null可清除使用者現有的電話號碼。 | 
| password | 字串 | 使用者的新原始密碼 (未經過雜湊處理)。長度不得少於六個字元。 | 
| displayName | 字串 | null | 使用者的顯示名稱。設為 null可清除使用者現有的顯示名稱。 | 
| photoURL | 字串 | null | 使用者的相片新網址。設為 null可清除使用者現有的相片網址。如果不是null,則必須是有效的網址。 | 
| disabled | 布林值 | 使用者是否已停用。 true:已停用。false:已啟用。 | 
更新使用者方法會在更新成功完成時,傳回更新後的 UserRecord 物件。
如果提供的 uid 不對應現有使用者、提供的電子郵件地址或電話號碼已由現有使用者使用,或因任何其他原因而無法更新使用者,上述方法就會失敗並傳回錯誤。如需完整的錯誤代碼清單,包括說明和解決步驟,請參閱「Admin Authentication API 錯誤」。
刪除使用者
Firebase Admin SDK 可依據下列項目刪除現有使用者:uid
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.");
刪除使用者方法會在刪除作業成功完成時,傳回空白結果。
如果提供的 uid 不對應現有使用者,或使用者因任何其他原因無法刪除,刪除使用者方法就會擲回錯誤。
如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Authentication API 錯誤」。
刪除多位使用者
Firebase Admin SDK 也能一次刪除多位使用者。不過請注意,如果使用 deleteUsers(uids) 等方法一次刪除多位使用者,系統不會觸發 Cloud Functions for Firebase 的 onDelete() 事件處理常式。這是因為批次刪除不會針對每位使用者觸發使用者刪除事件。如要為每位已刪除的使用者觸發使用者刪除事件,請一次刪除一位使用者。
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}')
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}");
}
刪除使用者方法會傳回無法刪除的使用者失敗清單。如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Authentication API 錯誤」。
列出所有使用者
Firebase Admin SDK 可讓您分批擷取完整的使用者清單:
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}");
}
每批結果都包含使用者清單和下一個網頁權杖,用於列出下一批使用者。如果已列出所有使用者,則不會傳回 pageToken。
如未指定 maxResults 欄位,系統會預設為每批 1000 位使用者。
這也是一次最多可列出的使用者人數。如果值大於上限,系統就會擲回引數錯誤。如未指定 pageToken,作業會列出開頭的使用者,並依 uid 排序。
如需錯誤代碼的完整清單 (包括說明和解決步驟),請參閱「Admin Authentication API 錯誤」。
所列使用者的密碼雜湊
如果用於產生要求 OAuth 存取權杖的使用者/服務帳戶具有 firebaseauth.configs.getHashConfig 權限,這個 API 也會傳回 Firebase Auth 後端為密碼使用者雜湊處理的 passwordSalt 和 passwordHash。否則系統不會設定 passwordHash 和 passwordSalt。
由於密碼雜湊屬於機密資訊,Firebase Admin SDK 服務帳戶預設沒有 firebaseauth.configs.getHashConfig 權限。您無法直接將權限新增至使用者/服務帳戶,但可以建立自訂 IAM 角色,間接新增權限。
如要建立自訂 IAM 角色,請按照下列步驟操作:
- 在 Google Cloud 控制台中,前往「IAM & admin」(IAM 與管理) 面板的「Roles」(角色) 頁面。
- 在頁面頂端的下拉式選單中選取專案。
- 按一下「建立角色」
- 按一下「新增權限」
- 搜尋 firebaseauth.configs.getHashConfig權限,然後選取該核取方塊。
- 按一下「新增」。
- 按一下「建立」,完成新角色的建立程序。
在「IAM」頁面中,將建立的自訂角色新增至使用者/服務帳戶:
- 在「IAM 與管理」面板中,選取「IAM」
- 從成員清單中選取要編輯的服務或使用者帳戶。
- 按一下「新增其他角色」。
- 搜尋先前建立的新自訂角色。
- 按一下 [儲存]。