Управление пользователями

Firebase Admin SDK предоставляет API для управления пользователями Firebase Authentication с повышенными привилегиями. С помощью API управления пользователями администратора можно программно выполнять следующие задачи в защищенной серверной среде:

  • Создавать новых пользователей без регулирования или ограничения частоты запросов.
  • Искать пользователей по разным критериям, например по идентификатору, адресу электронной почты или номеру телефона.
  • Перечислить всех пользователей определенного проекта пакетами.
  • Получать доступ к метаданным пользователей, включая дату создания аккаунта и дату последнего входа.
  • Удалять пользователей без необходимости вводить их существующий пароль.
  • Изменять свойства пользователей, в том числе пароль, без необходимости входить в аккаунт пользователя.
  • Подтверждать адреса электронной почты без выполнения дополнительных действий.
  • Изменить адрес электронной почты пользователя, не отправляя ссылки для отмены изменений.
  • Создавать новых пользователей с номером телефона без проверки по SMS.
  • Изменять номер телефона пользователя без подтверждения по SMS.
  • Предоставлять пользователям доступ офлайн в отключенном состоянии, а затем контролировать, когда их включать.
  • Создавайте собственные консоли пользователей, адаптированные к системе управления пользователями определенного приложения.

Подготовка

Чтобы использовать API управления пользователями, предоставляемый Firebase Admin SDK, вам понадобится сервисный аккаунт. Подробнее о том, как инициализировать Admin SDK, рассказывается в инструкциях по настройке.

Как получить пользовательские данные

Основной способ идентифицировать пользователя – по его uid, уникальному идентификатору. В 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}')

Проложить маршрут

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

Этот метод возвращает объект UserRecord для пользователя, соответствующего объекту uid, переданному методу.

Если указанный идентификатор 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}')

Проложить маршрут

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

Проложить маршрут

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 позволяет получать список пользователей на основе предоставленных вами идентификаторов. Вы можете идентифицировать пользователей по идентификатору, адресу электронной почты или номеру телефона. В одном вызове можно указать не более 100 идентификаторов. Идентификаторы могут быть разных типов:

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)

Проложить маршрут

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, либо сообщение об ошибке, указывающее, почему не удалось найти этот идентификатор. Полный список кодов ошибок, а также их описания и инструкции по устранению неполадок приведены в разделе Ошибки 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}')

Проложить маршрут

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

Проложить маршрут

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 string uid, который нужно назначить новому пользователю. Строка должна содержать от 1 до 128 символов. Если не указано, будет автоматически сгенерировано случайное значение uid. Чем короче uid, тем лучше.
email string Основной адрес электронной почты пользователя. Необходимо указать действительный адрес электронной почты.
emailVerified Логическое значение Подтвержден ли основной адрес электронной почты пользователя. Если не указано, по умолчанию используется значение false.
phoneNumber string Основной номер телефона пользователя. Укажите действительный номер телефона, соответствующий спецификации E.164.
password string Необработанный пароль пользователя. Пароль должен содержать не менее шести символов.
displayName string Отображаемое имя пользователя.
photoURL string URL фотографии пользователя.
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}')

Проложить маршрут

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 string Новый основной адрес электронной почты пользователя. Необходимо указать действительный адрес электронной почты.
emailVerified Логическое значение Подтвержден ли основной адрес электронной почты пользователя. Если не указано, по умолчанию используется значение false.
phoneNumber string | null Новый основной номер телефона пользователя. Укажите действительный номер телефона, соответствующий спецификации E.164. Установите значение null, чтобы удалить существующий номер телефона пользователя.
password string Новый пароль пользователя в виде обычного текста без хеширования. Пароль должен содержать не менее шести символов.
displayName string | null Новое отображаемое имя пользователя. Установите значение null, чтобы удалить существующее отображаемое имя пользователя.
photoURL string | null URL новой фотографии пользователя. Установите значение null, чтобы удалить существующий URL фотографии пользователя. Если значение атрибута не "null", необходимо указать действительный URL.
disabled Логическое значение Сведения о том, отключен ли пользователь. true – отключено; false – включено.

Метод update user возвращает обновленный объект 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')

Проложить маршрут

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 не соответствует существующему пользователю или пользователя нельзя удалить по какой-либо другой причине, метод delete user выдает ошибку. Полный список кодов ошибок с описаниями и инструкциями по устранению неполадок приведен в разделе Ошибки Admin Authentication API.

Как удалить нескольких пользователей

Firebase Admin SDK также позволяет удалять сразу несколько пользователей. Однако обратите внимание, что при использовании таких методов, как deleteUsers(uids), для одновременного удаления нескольких пользователей обработчики событий onDelete() для Cloud Functions for Firebase не будут запускаться. Это связано с тем, что при пакетном удалении не запускается событие удаления пользователя для каждого пользователя. Если вы хотите, чтобы для каждого удаленного пользователя активировалось событие удаления, удаляйте пользователей по одному.

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

Проложить маршрут

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

Метод delete users возвращает список ошибок для пользователей, которых не удалось удалить. Полный список кодов ошибок с описаниями и инструкциями по устранению неполадок приведен в разделе Ошибки 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)

Проложить маршрут

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

Каждая группа результатов содержит список пользователей и токен следующей страницы, который используется для получения следующей группы пользователей. Если все пользователи уже перечислены, возвращается значение "нет" (no) pageToken.

Если поле maxResults не указано, используется значение по умолчанию – 1000 пользователей на пакет. Это также максимальное количество пользователей, которое может быть указано одновременно. Если указать значение, превышающее максимальное, возникнет ошибка аргумента. Если параметр pageToken не указан, операция будет перечислять пользователей с начала, отсортированных по параметру uid.

Полный список кодов ошибок с описаниями и инструкциями по устранению неполадок приведен в разделе Ошибки Admin Authentication API.

Хеши паролей указанных пользователей

Этот API также возвращает хешированные значения passwordSalt и passwordHash, созданные на сервере Firebase Auth для пользователей, которые входят в аккаунт с помощью пароля, если у пользователя или сервисного аккаунта, использованного для создания токена доступа OAuth, есть разрешение firebaseauth.configs.getHashConfig. В противном случае параметры passwordHash и passwordSalt не будут заданы.

Из соображений безопасности сервисный аккаунт Firebase Admin SDK по умолчанию не имеет разрешения firebaseauth.configs.getHashConfig. Вы не можете добавить разрешение напрямую в аккаунт пользователя или сервисный аккаунт, но можете сделать это косвенно, создав специальную роль IAM.

Чтобы создать специальную роль IAM:

  1. Перейдите на страницу Роли на панели IAM и администрирование в консоли Google Cloud.
  2. Выберите проект в раскрывающемся списке в верхней части страницы.
  3. Нажмите Создать роль.
  4. Нажмите Добавить разрешения.
  5. Найдите разрешение firebaseauth.configs.getHashConfig и установите флажок рядом с ним.
  6. Нажмите Добавить.
  7. Нажмите Создать, чтобы завершить создание роли.

Добавьте созданную специальную роль пользователю или сервисному аккаунту на странице IAM:

  1. На панели IAM и администрирование выберите IAM.
  2. Выберите сервис или аккаунт пользователя из списка участников, чтобы изменить его.
  3. Нажмите Добавить ещё одну роль.
  4. Найдите созданную ранее специальную роль.
  5. Нажмите Сохранить.