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

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

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

Прежде чем начать

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

Получить данные пользователя

Основной способ идентификации пользователя — это его uid — уникальный идентификатор этого пользователя. Admin SDK предоставляет метод, позволяющий получать информацию о профилях пользователей по их uid :

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);
  });
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());
from firebase_admin import auth

user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(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)
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 не принадлежит существующему пользователю или пользователь не может быть получен по какой-либо другой причине, вышеуказанный метод выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API аутентификации администратора» .

В некоторых случаях у вас будет адрес электронной почты пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по электронной почте:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

В других случаях у вас будет номер телефона пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по номеру телефона:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK также позволяет получать список пользователей на основе предоставленных вами идентификаторов. Вы можете идентифицировать пользователей по их идентификатору пользователя, адресу электронной почты или номеру телефона. За один вызов можно передать максимум 100 идентификаторов. Идентификаторы могут содержать сочетание типов:

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

Создать пользователя

Admin SDK предоставляет метод, позволяющий создать нового пользователя Firebase Authentication . Этот метод принимает объект, содержащий информацию профиля для включения во вновь созданную учетную запись пользователя:

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);
  });
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());
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))
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)
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 для нового пользователя, вы можете включить его в качестве аргумента, передаваемого методу создания пользователя:

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);
  });
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());
user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(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)
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 нить URL-адрес фотографии пользователя.
disabled логическое значение Независимо от того, отключен ли пользователь. true для инвалидов; false для включенного. Если не указано, значение по умолчанию — false .

Метод создания пользователя возвращает объект UserRecord для вновь созданного пользователя.

Если предоставленный uid , адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть создан по какой-либо другой причине, описанный выше метод завершается ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Обновить пользователя

Firebase Admin SDK упрощает изменение данных существующего пользователя. Вам необходимо указать uid вместе со свойствами, которые необходимо обновить для этого пользователя:

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

Пользовательский метод update возвращает обновленный объект UserRecord после успешного завершения обновления.

Если предоставленный uid не соответствует существующему пользователю, указанный адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть обновлен по какой-либо другой причине, описанный выше метод завершается с ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK позволяет удалять существующих пользователей по их uid :

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
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)
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

Метод удаления пользователя возвращает пустой результат после успешного завершения удаления.

Если предоставленный uid не соответствует существующему пользователю или пользователь не может быть удален по какой-либо другой причине, метод удаления пользователя выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

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

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

Метод удаления пользователей возвращает список ошибок для пользователей, которых не удалось удалить. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Список всех пользователей

Firebase Admin SDK позволяет получать весь список пользователей в пакетном режиме:

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();
// 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());
}
# 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
	}
}
// 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 .

Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Хэши паролей перечисленных пользователей

Этот 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. Нажмите СОХРАНИТЬ .
,

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

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

Прежде чем начать

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

Получить данные пользователя

Основной способ идентификации пользователя — это его uid — уникальный идентификатор этого пользователя. Admin SDK предоставляет метод, позволяющий получать информацию о профилях пользователей по их uid :

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);
  });
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());
from firebase_admin import auth

user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(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)
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 не принадлежит существующему пользователю или пользователь не может быть получен по какой-либо другой причине, вышеуказанный метод выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API аутентификации администратора» .

В некоторых случаях у вас будет адрес электронной почты пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по электронной почте:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

В других случаях у вас будет номер телефона пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по номеру телефона:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK также позволяет получать список пользователей на основе предоставленных вами идентификаторов. Вы можете идентифицировать пользователей по их идентификатору пользователя, адресу электронной почты или номеру телефона. За один вызов можно передать максимум 100 идентификаторов. Идентификаторы могут содержать сочетание типов:

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

Создать пользователя

Admin SDK предоставляет метод, позволяющий создать нового пользователя Firebase Authentication . Этот метод принимает объект, содержащий информацию профиля для включения во вновь созданную учетную запись пользователя:

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);
  });
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());
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))
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)
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 для нового пользователя, вы можете включить его в качестве аргумента, передаваемого методу создания пользователя:

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);
  });
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());
user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(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)
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 нить URL-адрес фотографии пользователя.
disabled логическое значение Независимо от того, отключен ли пользователь. true для инвалидов; false для включенного. Если не указано, значение по умолчанию — false .

Метод создания пользователя возвращает объект UserRecord для вновь созданного пользователя.

Если предоставленный uid , адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть создан по какой-либо другой причине, описанный выше метод завершается ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Обновить пользователя

Firebase Admin SDK упрощает изменение данных существующего пользователя. Вам необходимо указать uid вместе со свойствами, которые необходимо обновить для этого пользователя:

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

Пользовательский метод update возвращает обновленный объект UserRecord после успешного завершения обновления.

Если предоставленный uid не соответствует существующему пользователю, указанный адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть обновлен по какой-либо другой причине, описанный выше метод завершается с ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK позволяет удалять существующих пользователей по их uid :

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
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)
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

Метод удаления пользователя возвращает пустой результат после успешного завершения удаления.

Если предоставленный uid не соответствует существующему пользователю или пользователь не может быть удален по какой-либо другой причине, метод удаления пользователя выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

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

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

Метод удаления пользователей возвращает список ошибок для пользователей, которых не удалось удалить. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Список всех пользователей

Firebase Admin SDK позволяет получать весь список пользователей в пакетном режиме:

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();
// 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());
}
# 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
	}
}
// 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 .

Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Хэши паролей перечисленных пользователей

Этот 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. Нажмите СОХРАНИТЬ .
,

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

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

Прежде чем начать

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

Получить данные пользователя

Основной способ идентификации пользователя — это его uid — уникальный идентификатор этого пользователя. Admin SDK предоставляет метод, позволяющий получать информацию о профилях пользователей по их uid :

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);
  });
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());
from firebase_admin import auth

user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(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)
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 не принадлежит существующему пользователю или пользователь не может быть получен по какой-либо другой причине, вышеуказанный метод выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API аутентификации администратора» .

В некоторых случаях у вас будет адрес электронной почты пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по электронной почте:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

В других случаях у вас будет номер телефона пользователя вместо его uid . Firebase Admin SDK поддерживает поиск информации о пользователе по номеру телефона:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(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)
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 выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK также позволяет получать список пользователей на основе предоставленных вами идентификаторов. Вы можете идентифицировать пользователей по их идентификатору пользователя, адресу электронной почты или номеру телефона. За один вызов можно передать максимум 100 идентификаторов. Идентификаторы могут содержать сочетание типов:

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

Создать пользователя

Admin SDK предоставляет метод, позволяющий создать нового пользователя Firebase Authentication . Этот метод принимает объект, содержащий информацию профиля для включения во вновь созданную учетную запись пользователя:

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);
  });
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());
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))
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)
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 для нового пользователя, вы можете включить его в качестве аргумента, передаваемого методу создания пользователя:

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);
  });
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());
user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(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)
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 нить URL-адрес фотографии пользователя.
disabled логическое значение Независимо от того, отключен ли пользователь. true для инвалидов; false для включенного. Если не указано, значение по умолчанию — false .

Метод создания пользователя возвращает объект UserRecord для вновь созданного пользователя.

Если предоставленный uid , адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть создан по какой-либо другой причине, описанный выше метод завершается ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Обновить пользователя

Firebase Admin SDK упрощает изменение данных существующего пользователя. Вам необходимо указать uid вместе со свойствами, которые необходимо обновить для этого пользователя:

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

Пользовательский метод update возвращает обновленный объект UserRecord после успешного завершения обновления.

Если предоставленный uid не соответствует существующему пользователю, указанный адрес электронной почты или номер телефона уже используется существующим пользователем или пользователь не может быть обновлен по какой-либо другой причине, описанный выше метод завершается ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

Firebase Admin SDK позволяет удалять существующих пользователей по их uid :

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
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)
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

Метод удаления пользователя возвращает пустой результат после успешного завершения удаления.

Если предоставленный uid не соответствует существующему пользователю или пользователь не может быть удален по какой-либо другой причине, метод удаления пользователя выдает ошибку. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

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

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

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

Метод удаления пользователей возвращает список ошибок для пользователей, которых не удалось удалить. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Список всех пользователей

Firebase Admin SDK позволяет получать весь список пользователей в пакетном режиме:

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();
// 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());
}
# 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
	}
}
// 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 .

Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API Authentication администратора» .

Хэши паролей перечисленных пользователей

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

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

Чтобы создать пользовательскую роль IAM:

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

Добавьте созданную пользовательскую роль в учетную запись пользователя/службы на странице IAM:

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

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

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

Прежде чем начать

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

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

Основным способом идентификации пользователя является их uid , уникальный идентификатор для этого пользователя. Admin SDK предоставляет метод, который позволяет получать информацию о профиле пользователей по uid :

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);
  });
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());
from firebase_admin import auth

user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(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)
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 не принадлежит существующему пользователю или пользователю не может быть извлечена по какой -либо другой причине, приведенный выше метод выбрасывает ошибку. Для полного списка кодов ошибок, включая описания и шаги разрешения, см. Ошибки API admin api .

В некоторых случаях у вас будет электронная почта пользователя вместо их uid . SDK Firebase Admin SDK поддерживает поиск пользовательской информации по электронной почте:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(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)
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 для пользователя, соответствующего предоставленному электронному письму.

Если предоставленная электронная почта не принадлежит существующему пользователю или пользователю не может быть извлечена по какой -либо другой причине, администратор SDK выбрасывает ошибку. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

В других случаях у вас будет номер телефона пользователя вместо их uid . Admin SDK Firebase поддерживает поиск пользовательской информации с номером телефона:

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);
  });
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());
from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(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)
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 для пользователя, соответствующего предоставленному номеру телефона.

Если предоставленный номер телефона не принадлежит существующему пользователю или пользователю не может быть извлечена по какой -либо другой причине, администратор SDK бросает ошибку. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

Объемно извлечь пользовательские данные

Admin SDK Firebase также позволяет получать список пользователей на основе идентификаторов, которые вы предоставляете. Вы можете идентифицировать пользователей по их идентификатору, электронной почте или номеру телефона. Максимум 100 идентификаторов могут быть предоставлены за один вызов. Идентификаторы могут содержать смесь типов:

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

Создать пользователя

Admin SDK предоставляет метод, который позволяет создавать нового пользователя Firebase Authentication . Этот метод принимает объект, содержащий информацию о профиле, чтобы включить в недавно созданную учетную запись пользователя:

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);
  });
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());
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))
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)
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 для нового пользователя, вы можете включить его в качестве аргумента, передаваемого методу создания пользователя:

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);
  });
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());
user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(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)
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. Свойства, поддерживаемые операцией Create User

Свойство Тип Описание
uid нить uid , чтобы назначить недавно созданному пользователю. Должен быть строка между 1-128 символами длиной, включительно. Если не предоставлено, будет автоматически генерировать случайный uid . Более короткий uid S предлагает лучшую производительность.
email нить Основное электронное письмо пользователя. Должен быть действительный адрес электронной почты.
emailVerified логическое значение Проверено ли первичное электронное письмо пользователя. Если не предоставлено, по умолчанию false .
phoneNumber нить Основной номер телефона пользователя. Должен быть действительный e.164 Специальный номер телефона.
password нить Необработанный пароль пользователя. Должно быть не менее шести символов длиной.
displayName нить Отображаемое имя пользователей.
photoURL нить URL -адрес пользователя.
disabled логическое значение Отключен ли пользователь. true для инвалидов; false для включения. Если не предоставлено, по умолчанию false .

Метод создания пользователя возвращает объект UserRecord для вновь созданного пользователя.

Если предоставленный uid , электронную почту или номер телефона уже используется существующим пользователем или пользователем не может быть создан по любой другой причине, приведенный выше метод не выполняется с ошибкой. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

Обновите пользователя

Admin SDK Firebase облегчает изменение данных существующего пользователя. Вам нужно указать uid вместе со свойствами для обновления этого пользователя:

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);
  });
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());
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))
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)
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 нить Новый основной номер телефона пользователя. Должен быть действительный e.164 Специальный номер телефона. Установите null , чтобы очистить существующий номер телефона пользователя.
password нить Новый необработанный пароль пользователя. Должно быть не менее шести символов длиной.
displayName строка | null Новое отображаемое имя пользователей. Установите в null , чтобы очистить существующее отображаемое имя пользователя.
photoURL строка | null Новый URL -адрес пользователей. Установите null , чтобы очистить существующий URL -адрес пользователя. Если не null , должен быть действительный URL.
disabled логическое значение Отключен ли пользователь. true для инвалидов; false для включения.

Метод обновления пользователя возвращает обновленный объект UserRecord , когда обновление успешно завершается.

Если при условии, что uid не соответствует существующему пользователю, предоставленный адрес электронной почты или номер телефона уже используется существующим пользователем, или пользователь не может быть обновлен по какой -либо другой причине, приведенный выше метод не выполняется с ошибкой. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

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

Admin SDK Firebase позволяет удалять существующих пользователей на их uid :

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
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)
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

Метод удаления пользователя возвращает пустой результат, когда удаление успешно завершается.

Если предоставленный uid не соответствует существующему пользователю или пользователю не может быть удален по какой -либо другой причине, метод удаления пользователя выбрасывает ошибку. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

Удалить несколько пользователей

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

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

Метод удаления пользователей возвращает список отказов для пользователей, которые не смогли быть удалены. Полный список кодов ошибок, включая описания и шаги разрешения, см. Ошибки API Authentication администратора .

Перечислите всех пользователей

Admin SDK Firebase позволяет извлекать весь список пользователей пакетами:

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();
// 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());
}
# 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
	}
}
// 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 .

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

Пароль хеши из перечисленных пользователей

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

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

Чтобы создать пользовательскую роль IAM:

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

Добавьте созданную пользовательскую роль в учетную запись пользователя/службы на странице IAM:

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