Gerenciar usuários

O SDK Admin do Firebase fornece uma API para gerenciar seus usuários do Firebase Authentication com privilégios elevados. A API de gerenciamento de usuários do administrador permite realizar, de modo programático, as seguintes tarefas em um ambiente de servidor seguro:

  • Criar novos usuários sem limitação de taxa.
  • Pesquisar usuários por diferentes critérios, como UID, e-mail ou número de telefone.
  • Listar todos os usuários de um projeto específico em lotes.
  • Acessar metadados de usuários, incluindo data de criação da conta e última data de login.
  • Excluir usuários sem exigir a senha existente.
  • Atualizar propriedades de usuários, incluindo senha, sem precisar fazer login como o usuário.
  • Verificar e-mails sem ter que passar pelos fluxos de ação fora de banda.
  • Alterar o e-mail de um usuário sem enviar links de e-mail para revogar as alterações.
  • Criar um novo usuário com um número de telefone sem ter que passar pelo fluxo de verificação SMS.
  • Alterar o número de telefone de um usuário sem ter que passar pelo fluxo de verificação SMS.
  • Fazer o provisionamento off-line de usuários em estado desativado e, depois, controlar a ativação.
  • Criar consoles personalizados de usuário ajustados para o sistema de gerenciamento de usuários de um app específico.

Antes de começar

Para usar a API de gerenciamento de usuários fornecida pelo SDK Admin do Firebase, você precisa ter uma conta de serviço. Siga as instruções de configuração para saber mais sobre como inicializar o SDK Admin.

Recuperar dados do usuário

A principal forma de identificar um usuário é pelo uid, que é um identificador exclusivo. O SDK Admin fornece um método que permite buscar as informações de perfil dos usuários pelo 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('Successfully fetched user data: {0}'.format(user.uid))

Go

// Get an auth client from the firebase.App
client, err := app.Auth(ctx)
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

u, err := client.GetUser(ctx, uid)
if err != nil {
	log.Fatalf("error getting user %s: %v\n", uid, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserAsync(uid);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Esse método retorna um objeto UserRecord para o usuário correspondente ao uid fornecido.

Se o uid indicado não pertencer a um usuário existente ou não for possível encontrar o usuário por qualquer outro motivo, o método acima vai gerar um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Auth.

Em alguns casos, você terá o e-mail do usuário em vez do uid. O SDK Admin do Firebase permite pesquisar as informações do usuário com um e-mail:

Node.js

getAuth()
  .getUserByEmail(email)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getEmail());

Python

from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(user.uid))

Go

u, err := client.GetUserByEmail(ctx, email)
if err != nil {
	log.Fatalf("error getting user by email %s: %v\n", email, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Esse método retorna um objeto UserRecord para o usuário correspondente ao e-mail fornecido.

Se o e-mail indicado não pertencer a um usuário existente ou não for possível encontrar o usuário por qualquer outro motivo, o método acima vai gerar um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Em outros casos, você terá o número de telefone do usuário, em vez do uid. O SDK Admin do Firebase permite pesquisar as informações do usuário com um número de telefone:

Node.js

getAuth()
  .getUserByPhoneNumber(phoneNumber)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data:  ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

UserRecord userRecord = FirebaseAuth.getInstance().getUserByPhoneNumber(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getPhoneNumber());

Python

from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(user.uid))

Go

u, err := client.GetUserByPhoneNumber(ctx, phone)
if err != nil {
	log.Fatalf("error getting user by phone %s: %v\n", phone, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

C#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

Esse método retorna um objeto UserRecord para o usuário correspondente ao número de telefone fornecido.

Se o número de telefone não pertencer a um usuário existente ou não for possível encontrar o usuário por qualquer outro motivo, o SDK Admin vai gerar um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Recuperar dados do usuário em massa

Com o SDK Admin do Firebase, também é possível recuperar uma lista de usuários com base nos identificadores fornecidos por você. Com ele, é possível identificar usuários pelo ID de usuário, e-mail ou número de telefone. Também é possível fornecer até 100 identificadores em uma única chamada. Os identificadores podem apresentar uma mistura de tipos:

Node.js

getAuth()
  .getUsers([
    { uid: 'uid1' },
    { email: 'user2@example.com' },
    { phoneNumber: '+15555550003' },
    { providerId: 'google.com', providerUid: 'google_uid4' },
  ])
  .then((getUsersResult) => {
    console.log('Successfully fetched user data:');
    getUsersResult.users.forEach((userRecord) => {
      console.log(userRecord);
    });

    console.log('Unable to find users corresponding to these identifiers:');
    getUsersResult.notFound.forEach((userIdentifier) => {
      console.log(userIdentifier);
    });
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

Java

GetUsersResult result = FirebaseAuth.getInstance().getUsersAsync(Arrays.asList(
    new UidIdentifier("uid1"),
    new EmailIdentifier("user2@example.com"),
    new PhoneIdentifier("+15555550003"),
    new ProviderIdentifier("google.com", "google_uid4"))).get();

System.out.println("Successfully fetched user data:");
for (UserRecord user : result.getUsers()) {
  System.out.println(user.getUid());
}

System.out.println("Unable to find users corresponding to these identifiers:");
for (UserIdentifier uid : result.getNotFound()) {
  System.out.println(uid);
}

Python

from firebase_admin import auth

result = auth.get_users([
    auth.UidIdentifier('uid1'),
    auth.EmailIdentifier('user2@example.com'),
    auth.PhoneIdentifier(+15555550003),
    auth.ProviderIdentifier('google.com', 'google_uid4')
])

print('Successfully fetched user data:')
for user in result.users:
    print(user.uid)

print('Unable to find users corresponding to these identifiers:')
for uid in result.not_found:
    print(uid)

Go

getUsersResult, err := client.GetUsers(ctx, []auth.UserIdentifier{
	auth.UIDIdentifier{UID: "uid1"},
	auth.EmailIdentifier{Email: "user@example.com"},
	auth.PhoneIdentifier{PhoneNumber: "+15555551234"},
	auth.ProviderIdentifier{ProviderID: "google.com", ProviderUID: "google_uid1"},
})
if err != nil {
	log.Fatalf("error retriving multiple users: %v\n", err)
}

log.Printf("Successfully fetched user data:")
for _, u := range getUsersResult.Users {
	log.Printf("%v", u)
}

log.Printf("Unable to find users corresponding to these identifiers:")
for _, id := range getUsersResult.NotFound {
	log.Printf("%v", id)
}

C#

GetUsersResult result = await FirebaseAuth.DefaultInstance.GetUsersAsync(
    new List<UserIdentifier>
    {
        new UidIdentifier("uid1"),
        new EmailIdentifier("user2@example.com"),
        new PhoneIdentifier("+15555550003"),
        new ProviderIdentifier("google.com", "google_uid4"),
    });

Console.WriteLine("Successfully fetched user data:");
foreach (UserRecord user in result.Users)
{
    Console.WriteLine($"User: {user.Uid}");
}

Console.WriteLine("Unable to find users corresponding to these identifiers:");
foreach (UserIdentifier uid in result.NotFound)
{
    Console.WriteLine($"{uid}");
}

Esse método retorna uma lista do mesmo tamanho que a lista de entrada, cada uma contendo o UserRecord correspondente ou um erro indicando o motivo para esse identificador não ter sido pesquisado. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Criar um usuário

O SDK Admin fornece um método que permite criar um novo usuário do Firebase Authentication. Esse método aceita um objeto que contém as informações de perfil para incluir na conta de usuário recém-criada:

Node.js

getAuth()
  .createUser({
    email: 'user@example.com',
    emailVerified: false,
    phoneNumber: '+11234567890',
    password: 'secretPassword',
    displayName: 'John Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: false,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

Java

CreateRequest request = new CreateRequest()
    .setEmail("user@example.com")
    .setEmailVerified(false)
    .setPassword("secretPassword")
    .setPhoneNumber("+11234567890")
    .setDisplayName("John Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(false);

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

Python

user = auth.create_user(
    email='user@example.com',
    email_verified=False,
    phone_number='+15555550100',
    password='secretPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=False)
print('Sucessfully created new user: {0}'.format(user.uid))

Go

params := (&auth.UserToCreate{}).
	Email("user@example.com").
	EmailVerified(false).
	PhoneNumber("+15555550100").
	Password("secretPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(false)
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Email = "user@example.com",
    EmailVerified = false,
    PhoneNumber = "+11234567890",
    Password = "secretPassword",
    DisplayName = "John Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = false,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

Por padrão, o Firebase Authentication vai gerar um uid aleatório para o novo usuário. Em vez disso, se você quiser especificar seu próprio uid para o novo usuário, inclua-o como argumento transmitido para o método de criação de usuário:

Node.js

getAuth()
  .createUser({
    uid: 'some-uid',
    email: 'user@example.com',
    phoneNumber: '+11234567890',
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

Java

CreateRequest request = new CreateRequest()
    .setUid("some-uid")
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890");

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

Python

user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(user.uid))

Go

params := (&auth.UserToCreate{}).
	UID(uid).
	Email("user@example.com").
	PhoneNumber("+15555550100")
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = "some-uid",
    Email = "user@example.com",
    PhoneNumber = "+11234567890",
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

Qualquer combinação das seguintes propriedades pode ser feita:

Tabela 1. Propriedades aceitas pela operação de criação de usuário

Propriedade Tipo Descrição
uid string O uid que será atribuído ao usuário recém-criado. Precisa ser uma string entre 1 a 128 caracteres. Caso não seja indicado, um uid aleatório vai ser gerado automaticamente. uids mais curtos oferecem um desempenho melhor.
email string O e-mail principal do usuário. Deve ser um endereço de e-mail válido.
emailVerified booleano Indica se o e-mail principal do usuário foi verificado ou não. Caso nenhum valor seja fornecido, o padrão será false.
phoneNumber string O número de telefone principal do usuário. Deve ser um número de telefone em compliance com a especificação E.164.
password string A senha bruta e sem hash do usuário. Deve ter pelo menos seis caracteres.
displayName string O nome de exibição do usuário.
photoURL string O URL da foto do usuário.
disabled booleano Indica se o usuário está desativado ou não. true para desativado e false para ativado. Caso nenhum valor seja fornecido, o padrão será false.

O método de criação de usuário retorna um objeto UserRecord para o usuário recém-criado.

Se o uid, e-mail ou número de telefone fornecidos estiverem sendo usados por um usuário atual, ou se não for possível criar o usuário por qualquer outro motivo, o método acima falhará devido a um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Atualizar um usuário

O SDK Admin do Firebase facilita a modificação dos dados de um usuário atual. É necessário especificar um uid com as propriedades que serão atualizadas para o usuário:

Node.js

getAuth()
  .updateUser(uid, {
    email: 'modifiedUser@example.com',
    phoneNumber: '+11234567890',
    emailVerified: true,
    password: 'newPassword',
    displayName: 'Jane Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: true,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully updated user', userRecord.toJSON());
  })
  .catch((error) => {
    console.log('Error updating user:', error);
  });

Java

UpdateRequest request = new UpdateRequest(uid)
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890")
    .setEmailVerified(true)
    .setPassword("newPassword")
    .setDisplayName("Jane Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(true);

UserRecord userRecord = FirebaseAuth.getInstance().updateUser(request);
System.out.println("Successfully updated user: " + userRecord.getUid());

Python

user = auth.update_user(
    uid,
    email='user@example.com',
    phone_number='+15555550100',
    email_verified=True,
    password='newPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=True)
print('Sucessfully updated user: {0}'.format(user.uid))

Go

params := (&auth.UserToUpdate{}).
	Email("user@example.com").
	EmailVerified(true).
	PhoneNumber("+15555550100").
	Password("newPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(true)
u, err := client.UpdateUser(ctx, uid, params)
if err != nil {
	log.Fatalf("error updating user: %v\n", err)
}
log.Printf("Successfully updated user: %v\n", u)

C#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = uid,
    Email = "modifiedUser@example.com",
    PhoneNumber = "+11234567890",
    EmailVerified = true,
    Password = "newPassword",
    DisplayName = "Jane Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = true,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.UpdateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully updated user: {userRecord.Uid}");

Qualquer combinação das seguintes propriedades pode ser feita:

Tabela 2. Propriedades com suporte na operação de atualização de usuário

Propriedade Tipo Descrição
email string O novo e-mail principal do usuário. Deve ser um endereço de e-mail válido.
emailVerified booleano Indica se o e-mail principal do usuário foi verificado ou não. Caso nenhum valor seja fornecido, o padrão será false.
phoneNumber string O novo número de telefone principal do usuário. Deve ser um número de telefone em compliance com a especificação E.164. Defina como null para limpar o número de telefone atual do usuário.
password string A senha bruta e sem hash do usuário. Deve ter pelo menos seis caracteres.
displayName string | null O novo nome de exibição do usuário. Defina como null para limpar o nome de exibição atual do usuário.
photoURL string | null O novo URL da foto do usuário. Defina como null para limpar o URL da foto atual do usuário. Se não for configurado como null, precisará ser um URL válido.
disabled booleano Indica se o usuário está desativado ou não. true para desativado e false para ativado.

O método de atualização de usuário vai retornar um objeto UserRecord se a atualização for concluída com êxito.

Se o uid indicado não corresponder a um usuário existente, o e-mail ou número de telefone enviado já estiver sendo usado ou se não for possível atualizar o usuário por qualquer outro motivo, o método acima vai gerar um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Excluir um usuário

O SDK Admin do Firebase permite excluir usuários atuais pelo uid:

Node.js

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });

Java

FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");

Python

auth.delete_user(uid)
print('Successfully deleted user')

Go

err := client.DeleteUser(ctx, uid)
if err != nil {
	log.Fatalf("error deleting user: %v\n", err)
}
log.Printf("Successfully deleted user: %s\n", uid)

C#

await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

O método de exclusão de usuário retorna um resultado em branco quando a exclusão é concluída com sucesso.

Se o uid indicado não corresponder a um usuário existente ou não for possível excluir o usuário por qualquer outro motivo, o método de exclusão de usuário vai gerar um erro. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Excluir vários usuários

O SDK Admin do Firebase também pode excluir vários usuários de uma só vez. No entanto, usar métodos como deleteUsers(uids) para excluir vários usuários de uma só vez não acionará manipuladores de eventos onDelete() para o Cloud Functions para Firebase. Isso ocorre porque a exclusão em lote não aciona um evento de exclusão de usuário em cada usuário. Exclua um usuário por vez se quiser que os eventos de exclusão de usuário sejam disparados para cada usuário excluído.

Node.js

getAuth()
  .deleteUsers([uid1, uid2, uid3])
  .then((deleteUsersResult) => {
    console.log(`Successfully deleted ${deleteUsersResult.successCount} users`);
    console.log(`Failed to delete ${deleteUsersResult.failureCount} users`);
    deleteUsersResult.errors.forEach((err) => {
      console.log(err.error.toJSON());
    });
  })
  .catch((error) => {
    console.log('Error deleting users:', error);
  });

Java

DeleteUsersResult result = FirebaseAuth.getInstance().deleteUsersAsync(
    Arrays.asList("uid1", "uid2", "uid3")).get();

System.out.println("Successfully deleted " + result.getSuccessCount() + " users");
System.out.println("Failed to delete " + result.getFailureCount() + " users");
for (ErrorInfo error : result.getErrors()) {
  System.out.println("error #" + error.getIndex() + ", reason: " + error.getReason());
}

Python

from firebase_admin import auth

result = auth.delete_users(["uid1", "uid2", "uid3"])

print('Successfully deleted {0} users'.format(result.success_count))
print('Failed to delete {0} users'.format(result.failure_count))
for err in result.errors:
    print('error #{0}, reason: {1}'.format(result.index, result.reason))

Go

deleteUsersResult, err := client.DeleteUsers(ctx, []string{"uid1", "uid2", "uid3"})
if err != nil {
	log.Fatalf("error deleting users: %v\n", err)
}

log.Printf("Successfully deleted %d users", deleteUsersResult.SuccessCount)
log.Printf("Failed to delete %d users", deleteUsersResult.FailureCount)
for _, err := range deleteUsersResult.Errors {
	log.Printf("%v", err)
}

C#

DeleteUsersResult result = await FirebaseAuth.DefaultInstance.DeleteUsersAsync(new List<string>
    {
        "uid1",
        "uid2",
        "uid3",
    });

Console.WriteLine($"Successfully deleted {result.SuccessCount} users.");
Console.WriteLine($"Failed to delete {result.FailureCount} users.");

foreach (ErrorInfo err in result.Errors)
{
    Console.WriteLine($"Error #{err.Index}, reason: {err.Reason}");
}

O método de exclusão de usuários retorna uma lista de falhas para os usuários que não puderam ser excluídos. Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Listar todos os usuários

O SDK Admin do Firebase permite recuperar toda a lista de usuários em lotes:

Node.js

const listAllUsers = (nextPageToken) => {
  // List batch of users, 1000 at a time.
  getAuth()
    .listUsers(1000, nextPageToken)
    .then((listUsersResult) => {
      listUsersResult.users.forEach((userRecord) => {
        console.log('user', userRecord.toJSON());
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch((error) => {
      console.log('Error listing users:', error);
    });
};
// Start listing users from the beginning, 1000 at a time.
listAllUsers();

Java

// Start listing users from the beginning, 1000 at a time.
ListUsersPage page = FirebaseAuth.getInstance().listUsers(null);
while (page != null) {
  for (ExportedUserRecord user : page.getValues()) {
    System.out.println("User: " + user.getUid());
  }
  page = page.getNextPage();
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
page = FirebaseAuth.getInstance().listUsers(null);
for (ExportedUserRecord user : page.iterateAll()) {
  System.out.println("User: " + user.getUid());
}

Python

# Start listing users from the beginning, 1000 at a time.
page = auth.list_users()
while page:
    for user in page.users:
        print('User: ' + user.uid)
    # Get next batch of users.
    page = page.get_next_page()

# Iterate through all users. This will still retrieve users in batches,
# buffering no more than 1000 users in memory at a time.
for user in auth.list_users().iterate_all():
    print('User: ' + user.uid)

Go

// Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API
iter := client.Users(ctx, "")
for {
	user, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		log.Fatalf("error listing users: %s\n", err)
	}
	log.Printf("read user user: %v\n", user)
}

// Iterating by pages 100 users at a time.
// Note that using both the Next() function on an iterator and the NextPage()
// on a Pager wrapping that same iterator will result in an error.
pager := iterator.NewPager(client.Users(ctx, ""), 100, "")
for {
	var users []*auth.ExportedUserRecord
	nextPageToken, err := pager.NextPage(&users)
	if err != nil {
		log.Fatalf("paging error %v\n", err)
	}
	for _, u := range users {
		log.Printf("read user user: %v\n", u)
	}
	if nextPageToken == "" {
		break
	}
}

C#

// Start listing users from the beginning, 1000 at a time.
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (await responses.MoveNextAsync())
{
    ExportedUserRecords response = responses.Current;
    foreach (ExportedUserRecord user in response.Users)
    {
        Console.WriteLine($"User: {user.Uid}");
    }
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
var enumerator = FirebaseAuth.DefaultInstance.ListUsersAsync(null).GetAsyncEnumerator();
while (await enumerator.MoveNextAsync())
{
    ExportedUserRecord user = enumerator.Current;
    Console.WriteLine($"User: {user.Uid}");
}

Cada lote de resultados contém uma lista de usuários e o token de próxima página usado para listar o próximo lote de usuários. Quando todos os usuários tiverem sido listados, nenhum pageToken será retornado.

Se nenhum campo maxResults for especificado, o padrão de 1.000 usuários por lote será usado. Esse é também o número máximo de usuários autorizados a serem listados por vez. Qualquer valor maior que o máximo lançará um erro de argumento. Se nenhum pageToken for especificado, a operação listará os usuários desde o início, ordenados por uid.

Para ver uma lista completa de códigos de erro, incluindo descrições e etapas de resolução, consulte Erros da API Admin Authentication.

Hashes de senha dos usuários listados

Se a conta de usuário/serviço usada para gerar a solicitação do token de acesso OAuth tiver a permissão firebaseauth.configs.getHashConfig, a API retornará passwordSalt e passwordHash com hash aplicado pelo back-end do Firebase Auth para usuários de senhas. Caso contrário, passwordHash e passwordSalt não serão definidos.

Devido à natureza confidencial dos hashes de senha, a conta de serviço do SDK Admin do Firebase não tem a permissão firebaseauth.configs.getHashConfig por padrão. Não é possível adicionar uma permissão diretamente a uma conta de usuário/serviço, mas é possível fazer isso indiretamente ao criar um papel personalizado do IAM.

Para criar o papel, siga estas etapas:

  1. Acesse a página Papéis no painel IAM e administrador do Console do Google Cloud.
  2. Na parte de cima da página, selecione o projeto no menu suspenso.
  3. Clique em CRIAR PAPEL
  4. Clique em ADICIONAR PERMISSÕES
  5. Procure a permissão firebaseauth.configs.getHashConfig e marque a caixa de seleção.
  6. Clique em ADICIONAR.
  7. Selecione CRIAR para concluir o processo.

Para adicionar o papel personalizado à conta de usuário/serviço na página do IAM, siga estas etapas:

  1. No painel IAM e administrador, selecione IAM
  2. Procure a conta de usuário/serviço na lista de membros editáveis e a selecione.
  3. Clique em ADICIONAR OUTRO PAPEL.
  4. Pesquise o novo papel personalizado que você criou.
  5. Clique em SALVAR.