Firebase Admin SDK предоставляет API для управления пользователями Firebase Authentication с повышенными привилегиями. API для управления администраторами позволяет программно выполнять следующие задачи из безопасной серверной среды:
- Создавайте новых пользователей без регулирования или ограничения частоты запросов.
- Ищите пользователей по разным критериям, например по UID, адресу электронной почты или номеру телефона.
- Получить список всех пользователей указанного проекта по пакетам.
- Доступ к метаданным пользователя, включая дату создания аккаунта и дату последнего входа.
- Удалять пользователей без ввода их текущего пароля.
- Обновлять свойства пользователей, включая пароли, не входя в их аккаунты.
- Подтверждайте адреса электронной почты без необходимости проходить через внешние процессы подтверждения.
- Изменение адреса электронной почты пользователя без отправки ссылок для отмены этих изменений.
- Создайте нового пользователя с номером телефона, не проходя процедуру подтверждения по SMS.
- Изменение номера телефона пользователя без подтверждения по SMS.
- Вы можете создать пользователей в отключенном состоянии, а затем включить их, когда это потребуется.
- Создавайте пользовательские консоли, адаптированные к системе управления пользователями конкретного приложения.
Подготовка
Чтобы использовать API управления пользователями, предоставляемый Firebase Admin SDK, у вас должен быть сервисный аккаунт. Подробные сведения об инициализации Admin SDK приведены в инструкциях по настройке.
Получение пользовательских данных
Основной способ идентификации пользователя – по его uid, уникальному идентификатору этого пользователя. Admin SDK предоставляет метод, позволяющий получать информацию профиля пользователей по их uid:
Node.js
getAuth()
.getUser(uid)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUser(uid);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getUid());
Python
from firebase_admin import auth
user = auth.get_user(uid)
print(f'Successfully fetched user data: {user.uid}')
Проложить маршрут
// Get an auth client from the firebase.App
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
u, err := client.GetUser(ctx, uid)
if err != nil {
log.Fatalf("error getting user %s: %v\n", uid, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserAsync(uid);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
Этот метод возвращает объект UserRecord для пользователя, соответствующего значению uid, которое передано методу.
Если указанный uid не принадлежит существующему пользователю или пользователя невозможно получить по какой-либо другой причине, указанный выше метод выдает ошибку.
Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Auth API.
В некоторых случаях у вас будет адрес электронной почты пользователя вместо его uid. Firebase Admin SDK поддерживает поиск информации о пользователях по адресу электронной почты:
Node.js
getAuth()
.getUserByEmail(email)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getEmail());
Python
from firebase_admin import auth
user = auth.get_user_by_email(email)
print(f'Successfully fetched user data: {user.uid}')
Проложить маршрут
u, err := client.GetUserByEmail(ctx, email)
if err != nil {
log.Fatalf("error getting user by email %s: %v\n", email, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
Этот метод возвращает объект UserRecord для пользователя, соответствующего указанному адресу электронной почты.
Если указанный адрес электронной почты не принадлежит существующему пользователю или пользователя невозможно получить по какой-либо другой причине, Admin SDK выдает ошибку. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
В других случаях у вас будет номер телефона пользователя, а не его uid. Firebase Admin SDK поддерживает поиск информации о пользователях по номеру телефона:
Node.js
getAuth()
.getUserByPhoneNumber(phoneNumber)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUserByPhoneNumber(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getPhoneNumber());
Python
from firebase_admin import auth
user = auth.get_user_by_phone_number(phone)
print(f'Successfully fetched user data: {user.uid}')
Проложить маршрут
u, err := client.GetUserByPhoneNumber(ctx, phone)
if err != nil {
log.Fatalf("error getting user by phone %s: %v\n", phone, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
Этот метод возвращает объект UserRecord для пользователя, соответствующего указанному номеру телефона.
Если указанный номер телефона не принадлежит существующему пользователю или пользователя невозможно получить по какой-либо другой причине, Admin SDK выдает ошибку. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Массовое извлечение пользовательских данных
Firebase Admin SDK также позволяет получать список пользователей на основе предоставленных вами идентификаторов. Вы можете идентифицировать пользователей по их идентификатору, адресу электронной почты или номеру телефона. В одном вызове можно передать не более 100 идентификаторов. Идентификаторы могут быть разных типов:
Node.js
getAuth()
.getUsers([
{ uid: 'uid1' },
{ email: 'user2@example.com' },
{ phoneNumber: '+15555550003' },
{ providerId: 'google.com', providerUid: 'google_uid4' },
])
.then((getUsersResult) => {
console.log('Successfully fetched user data:');
getUsersResult.users.forEach((userRecord) => {
console.log(userRecord);
});
console.log('Unable to find users corresponding to these identifiers:');
getUsersResult.notFound.forEach((userIdentifier) => {
console.log(userIdentifier);
});
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
GetUsersResult result = FirebaseAuth.getInstance().getUsersAsync(Arrays.asList(
new UidIdentifier("uid1"),
new EmailIdentifier("user2@example.com"),
new PhoneIdentifier("+15555550003"),
new ProviderIdentifier("google.com", "google_uid4"))).get();
System.out.println("Successfully fetched user data:");
for (UserRecord user : result.getUsers()) {
System.out.println(user.getUid());
}
System.out.println("Unable to find users corresponding to these identifiers:");
for (UserIdentifier uid : result.getNotFound()) {
System.out.println(uid);
}
Python
from firebase_admin import auth
result = auth.get_users([
auth.UidIdentifier('uid1'),
auth.EmailIdentifier('user2@example.com'),
auth.PhoneIdentifier(+15555550003),
auth.ProviderIdentifier('google.com', 'google_uid4')
])
print('Successfully fetched user data:')
for user in result.users:
print(user.uid)
print('Unable to find users corresponding to these identifiers:')
for uid in result.not_found:
print(uid)
Проложить маршрут
getUsersResult, err := client.GetUsers(ctx, []auth.UserIdentifier{
auth.UIDIdentifier{UID: "uid1"},
auth.EmailIdentifier{Email: "user@example.com"},
auth.PhoneIdentifier{PhoneNumber: "+15555551234"},
auth.ProviderIdentifier{ProviderID: "google.com", ProviderUID: "google_uid1"},
})
if err != nil {
log.Fatalf("error retriving multiple users: %v\n", err)
}
log.Printf("Successfully fetched user data:")
for _, u := range getUsersResult.Users {
log.Printf("%v", u)
}
log.Printf("Unable to find users corresponding to these identifiers:")
for _, id := range getUsersResult.NotFound {
log.Printf("%v", id)
}
C#
GetUsersResult result = await FirebaseAuth.DefaultInstance.GetUsersAsync(
new List<UserIdentifier>
{
new UidIdentifier("uid1"),
new EmailIdentifier("user2@example.com"),
new PhoneIdentifier("+15555550003"),
new ProviderIdentifier("google.com", "google_uid4"),
});
Console.WriteLine("Successfully fetched user data:");
foreach (UserRecord user in result.Users)
{
Console.WriteLine($"User: {user.Uid}");
}
Console.WriteLine("Unable to find users corresponding to these identifiers:");
foreach (UserIdentifier uid in result.NotFound)
{
Console.WriteLine($"{uid}");
}
Этот метод возвращает список того же размера, что и входной список, причем каждая запись содержит либо соответствующий UserRecord, либо ошибку, указывающую, почему этот идентификатор не удалось найти. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Как создать пользователя
Admin SDK предоставляет метод, который позволяет создать нового пользователя Firebase Authentication. Этот метод принимает объект, содержащий информацию профиля, которая будет включена в созданный аккаунт пользователя:
Node.js
getAuth()
.createUser({
email: 'user@example.com',
emailVerified: false,
phoneNumber: '+11234567890',
password: 'secretPassword',
displayName: 'John Doe',
photoURL: 'http://www.example.com/12345678/photo.png',
disabled: false,
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully created new user:', userRecord.uid);
})
.catch((error) => {
console.log('Error creating new user:', error);
});
Java
CreateRequest request = new CreateRequest()
.setEmail("user@example.com")
.setEmailVerified(false)
.setPassword("secretPassword")
.setPhoneNumber("+11234567890")
.setDisplayName("John Doe")
.setPhotoUrl("http://www.example.com/12345678/photo.png")
.setDisabled(false);
UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());
Python
user = auth.create_user(
email='user@example.com',
email_verified=False,
phone_number='+15555550100',
password='secretPassword',
display_name='John Doe',
photo_url='http://www.example.com/12345678/photo.png',
disabled=False)
print(f'Sucessfully created new user: {user.uid}')
Проложить маршрут
params := (&auth.UserToCreate{}).
Email("user@example.com").
EmailVerified(false).
PhoneNumber("+15555550100").
Password("secretPassword").
DisplayName("John Doe").
PhotoURL("http://www.example.com/12345678/photo.png").
Disabled(false)
u, err := client.CreateUser(ctx, params)
if err != nil {
log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Email = "user@example.com",
EmailVerified = false,
PhoneNumber = "+11234567890",
Password = "secretPassword",
DisplayName = "John Doe",
PhotoUrl = "http://www.example.com/12345678/photo.png",
Disabled = false,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");
По умолчанию Firebase Authentication генерирует случайный uid для нового пользователя. Если вы хотите указать собственный uid для нового пользователя, вы можете передать его в качестве аргумента в метод создания пользователя:
Node.js
getAuth()
.createUser({
uid: 'some-uid',
email: 'user@example.com',
phoneNumber: '+11234567890',
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully created new user:', userRecord.uid);
})
.catch((error) => {
console.log('Error creating new user:', error);
});
Java
CreateRequest request = new CreateRequest()
.setUid("some-uid")
.setEmail("user@example.com")
.setPhoneNumber("+11234567890");
UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());
Python
user = auth.create_user(
uid='some-uid', email='user@example.com', phone_number='+15555550100')
print(f'Sucessfully created new user: {user.uid}')
Проложить маршрут
params := (&auth.UserToCreate{}).
UID(uid).
Email("user@example.com").
PhoneNumber("+15555550100")
u, err := client.CreateUser(ctx, params)
if err != nil {
log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Uid = "some-uid",
Email = "user@example.com",
PhoneNumber = "+11234567890",
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");
Можно указать любую комбинацию следующих свойств:
Таблица 1. Свойства, поддерживаемые операцией создания пользователя
| Ресурс | Тип | Описание |
|---|---|---|
uid |
string |
uid, которую нужно назначить новому пользователю. Должно быть строкой длиной от 1 до 128 символов включительно. Если значение не указано, будет автоматически сгенерировано случайное значение uid. Чем короче uid, тем выше эффективность.
|
email |
string | Основной адрес электронной почты пользователя. Необходимо указать действительный адрес электронной почты. |
emailVerified |
Логическое значение |
Подтвержден ли основной адрес электронной почты пользователя. Если не указано, по умолчанию используется false.
|
phoneNumber |
string | Основной номер телефона пользователя. Номер телефона должен соответствовать стандарту E.164. |
password |
string | Необработанный, нехешированный пароль пользователя. Должен содержать не менее шести символов. |
displayName |
string | Отображаемое имя пользователя. |
photoURL |
string | URL фотографии пользователя. |
disabled |
Логическое значение |
Сведения о том, отключен ли пользователь. true – отключено;
false – включено. Если значение не указано, по умолчанию используется false.
|
Метод создания пользователя возвращает объект UserRecord для нового пользователя.
Если указанный uid, адрес электронной почты или номер телефона уже используется существующим пользователем или пользователя невозможно создать по какой-либо другой причине, вышеуказанный метод завершается ошибкой. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Как обновить данные пользователя
Firebase Admin SDK позволяет изменять данные существующих пользователей. Вам нужно указать uid вместе со свойствами, которые нужно обновить для этого пользователя:
Node.js
getAuth()
.updateUser(uid, {
email: 'modifiedUser@example.com',
phoneNumber: '+11234567890',
emailVerified: true,
password: 'newPassword',
displayName: 'Jane Doe',
photoURL: 'http://www.example.com/12345678/photo.png',
disabled: true,
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully updated user', userRecord.toJSON());
})
.catch((error) => {
console.log('Error updating user:', error);
});
Java
UpdateRequest request = new UpdateRequest(uid)
.setEmail("user@example.com")
.setPhoneNumber("+11234567890")
.setEmailVerified(true)
.setPassword("newPassword")
.setDisplayName("Jane Doe")
.setPhotoUrl("http://www.example.com/12345678/photo.png")
.setDisabled(true);
UserRecord userRecord = FirebaseAuth.getInstance().updateUser(request);
System.out.println("Successfully updated user: " + userRecord.getUid());
Python
user = auth.update_user(
uid,
email='user@example.com',
phone_number='+15555550100',
email_verified=True,
password='newPassword',
display_name='John Doe',
photo_url='http://www.example.com/12345678/photo.png',
disabled=True)
print(f'Sucessfully updated user: {user.uid}')
Проложить маршрут
params := (&auth.UserToUpdate{}).
Email("user@example.com").
EmailVerified(true).
PhoneNumber("+15555550100").
Password("newPassword").
DisplayName("John Doe").
PhotoURL("http://www.example.com/12345678/photo.png").
Disabled(true)
u, err := client.UpdateUser(ctx, uid, params)
if err != nil {
log.Fatalf("error updating user: %v\n", err)
}
log.Printf("Successfully updated user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Uid = uid,
Email = "modifiedUser@example.com",
PhoneNumber = "+11234567890",
EmailVerified = true,
Password = "newPassword",
DisplayName = "Jane Doe",
PhotoUrl = "http://www.example.com/12345678/photo.png",
Disabled = true,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.UpdateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully updated user: {userRecord.Uid}");
Можно указать любую комбинацию следующих свойств:
Таблица 2. Свойства, поддерживаемые операцией обновления пользователя
| Ресурс | Тип | Описание |
|---|---|---|
email |
string | Новый основной адрес электронной почты пользователя. Необходимо указать действительный адрес электронной почты. |
emailVerified |
Логическое значение |
Подтвержден ли основной адрес электронной почты пользователя. Если не указано, по умолчанию используется false.
|
phoneNumber |
string | null |
Новый основной номер телефона пользователя. Номер телефона должен соответствовать стандарту E.164. Чтобы удалить существующий номер телефона пользователя, задайте значение null.
|
password |
string | Новый необработанный, нехешированный пароль пользователя. Должен содержать не менее шести символов. |
displayName |
string | null |
Новое отображаемое название пользователя. Установите значение null, чтобы удалить существующее отображаемое имя пользователя.
|
photoURL |
string | null |
URL нового фото пользователя. Установите значение null, чтобы удалить существующий URL фотографии пользователя. Если значение не равно null, оно должно быть действительным URL.
|
disabled |
Логическое значение |
Сведения о том, отключен ли пользователь. true – отключено;
false – включено.
|
Метод update user возвращает обновленный объект UserRecord, когда обновление успешно завершено.
Если указанный идентификатор uid не соответствует существующему пользователю, указанный адрес электронной почты или номер телефона уже используется существующим пользователем или данные пользователя не могут быть обновлены по какой-либо другой причине, вышеуказанный метод завершается ошибкой. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Удаление пользователя
Firebase Admin SDK позволяет удалять существующих пользователей по их uid:
Node.js
getAuth()
.deleteUser(uid)
.then(() => {
console.log('Successfully deleted user');
})
.catch((error) => {
console.log('Error deleting user:', error);
});
Java
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
Python
auth.delete_user(uid)
print('Successfully deleted user')
Проложить маршрут
err := client.DeleteUser(ctx, uid)
if err != nil {
log.Fatalf("error deleting user: %v\n", err)
}
log.Printf("Successfully deleted user: %s\n", uid)
C#
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");
Если удаление пользователя прошло успешно, метод delete user возвращает пустой результат.
Если указанный uid не соответствует существующему пользователю или пользователя нельзя удалить по какой-либо другой причине, метод удаления пользователя выдает ошибку.
Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Как удалить несколько аккаунтов пользователей
Firebase Admin SDK также позволяет удалять несколько пользователей одновременно. Однако обратите внимание, что при использовании таких методов, как deleteUsers(uids), для одновременного удаления нескольких пользователей обработчики событий onDelete() для Cloud Functions for Firebase не активируются.
Это связано с тем, что при пакетном удалении не запускается событие удаления для каждого пользователя. Если вы хотите, чтобы события удаления пользователей активировались для каждого удаленного пользователя, удаляйте пользователей по одному.
Node.js
getAuth()
.deleteUsers([uid1, uid2, uid3])
.then((deleteUsersResult) => {
console.log(`Successfully deleted ${deleteUsersResult.successCount} users`);
console.log(`Failed to delete ${deleteUsersResult.failureCount} users`);
deleteUsersResult.errors.forEach((err) => {
console.log(err.error.toJSON());
});
})
.catch((error) => {
console.log('Error deleting users:', error);
});
Java
DeleteUsersResult result = FirebaseAuth.getInstance().deleteUsersAsync(
Arrays.asList("uid1", "uid2", "uid3")).get();
System.out.println("Successfully deleted " + result.getSuccessCount() + " users");
System.out.println("Failed to delete " + result.getFailureCount() + " users");
for (ErrorInfo error : result.getErrors()) {
System.out.println("error #" + error.getIndex() + ", reason: " + error.getReason());
}
Python
from firebase_admin import auth
result = auth.delete_users(["uid1", "uid2", "uid3"])
print(f'Successfully deleted {result.success_count} users')
print(f'Failed to delete {result.failure_count} users')
for err in result.errors:
print(f'error #{result.index}, reason: {result.reason}')
Проложить маршрут
deleteUsersResult, err := client.DeleteUsers(ctx, []string{"uid1", "uid2", "uid3"})
if err != nil {
log.Fatalf("error deleting users: %v\n", err)
}
log.Printf("Successfully deleted %d users", deleteUsersResult.SuccessCount)
log.Printf("Failed to delete %d users", deleteUsersResult.FailureCount)
for _, err := range deleteUsersResult.Errors {
log.Printf("%v", err)
}
C#
DeleteUsersResult result = await FirebaseAuth.DefaultInstance.DeleteUsersAsync(new List<string>
{
"uid1",
"uid2",
"uid3",
});
Console.WriteLine($"Successfully deleted {result.SuccessCount} users.");
Console.WriteLine($"Failed to delete {result.FailureCount} users.");
foreach (ErrorInfo err in result.Errors)
{
Console.WriteLine($"Error #{err.Index}, reason: {err.Reason}");
}
Метод удаления пользователей возвращает список ошибок для пользователей, которых не удалось удалить. Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Как получить список всех пользователей
Firebase Admin SDK позволяет получать весь список пользователей пакетами:
Node.js
const listAllUsers = (nextPageToken) => {
// List batch of users, 1000 at a time.
getAuth()
.listUsers(1000, nextPageToken)
.then((listUsersResult) => {
listUsersResult.users.forEach((userRecord) => {
console.log('user', userRecord.toJSON());
});
if (listUsersResult.pageToken) {
// List next batch of users.
listAllUsers(listUsersResult.pageToken);
}
})
.catch((error) => {
console.log('Error listing users:', error);
});
};
// Start listing users from the beginning, 1000 at a time.
listAllUsers();
Java
// Start listing users from the beginning, 1000 at a time.
ListUsersPage page = FirebaseAuth.getInstance().listUsers(null);
while (page != null) {
for (ExportedUserRecord user : page.getValues()) {
System.out.println("User: " + user.getUid());
}
page = page.getNextPage();
}
// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
page = FirebaseAuth.getInstance().listUsers(null);
for (ExportedUserRecord user : page.iterateAll()) {
System.out.println("User: " + user.getUid());
}
Python
# Start listing users from the beginning, 1000 at a time.
page = auth.list_users()
while page:
for user in page.users:
print('User: ' + user.uid)
# Get next batch of users.
page = page.get_next_page()
# Iterate through all users. This will still retrieve users in batches,
# buffering no more than 1000 users in memory at a time.
for user in auth.list_users().iterate_all():
print('User: ' + user.uid)
Проложить маршрут
// Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API
iter := client.Users(ctx, "")
for {
user, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("error listing users: %s\n", err)
}
log.Printf("read user user: %v\n", user)
}
// Iterating by pages 100 users at a time.
// Note that using both the Next() function on an iterator and the NextPage()
// on a Pager wrapping that same iterator will result in an error.
pager := iterator.NewPager(client.Users(ctx, ""), 100, "")
for {
var users []*auth.ExportedUserRecord
nextPageToken, err := pager.NextPage(&users)
if err != nil {
log.Fatalf("paging error %v\n", err)
}
for _, u := range users {
log.Printf("read user user: %v\n", u)
}
if nextPageToken == "" {
break
}
}
C#
// Start listing users from the beginning, 1000 at a time.
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (await responses.MoveNextAsync())
{
ExportedUserRecords response = responses.Current;
foreach (ExportedUserRecord user in response.Users)
{
Console.WriteLine($"User: {user.Uid}");
}
}
// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
var enumerator = FirebaseAuth.DefaultInstance.ListUsersAsync(null).GetAsyncEnumerator();
while (await enumerator.MoveNextAsync())
{
ExportedUserRecord user = enumerator.Current;
Console.WriteLine($"User: {user.Uid}");
}
Каждая группа результатов содержит список пользователей и токен следующей страницы, который используется для получения следующей группы пользователей. Если все пользователи уже перечислены, pageToken не возвращается.
Если поле maxResults не указано, по умолчанию используется значение 1000 пользователей на пакет.
Это также максимальное количество пользователей, которое может быть указано за один раз. Если указать значение больше максимального, возникнет ошибка аргумента.
Если параметр pageToken не указан, операция вернет список пользователей с самого начала, упорядоченный по uid.
Полный список кодов ошибок с описаниями и инструкциями по устранению приведен в статье Ошибки Admin Authentication API.
Хеши паролей перечисленных пользователей
Этот API также возвращает passwordSalt и passwordHash, хешированные серверной частью Firebase Auth для пользователей с паролем, если у аккаунта пользователя или сервисного аккаунта, используемого для создания токена доступа OAuth запроса, есть разрешение firebaseauth.configs.getHashConfig. В противном случае passwordHash и passwordSalt не будут заданы.
Из соображений безопасности у сервисного аккаунта Firebase Admin SDK по умолчанию нет разрешения firebaseauth.configs.getHashConfig. Вы не можете добавить разрешение напрямую в аккаунт пользователя или сервисный аккаунт, но можете сделать это косвенно, создав специальную роль IAM.
Чтобы создать специальную роль IAM, выполните следующие действия:
- Перейдите на страницу Roles (Роли) на панели IAM & admin (IAM и администрирование) в консоли Google Cloud.
- Выберите проект в раскрывающемся списке вверху страницы.
- Нажмите Создать роль.
- Нажмите ADD PERMISSIONS (Добавить разрешения).
- Найдите разрешение
firebaseauth.configs.getHashConfigи установите флажок рядом с ним. - Нажмите Добавить.
- Нажмите Создать.
Добавьте созданную специальную роль пользователю или сервисному аккаунту на странице IAM:
- На панели IAM и администрирование выберите IAM.
- Выберите сервис или аккаунт пользователя из списка участников.
- Нажмите Добавить ещё одну роль.
- Найдите созданную ранее специальную роль.
- Нажмите Сохранить.