Gérer les utilisateurs par programmation
Ce document explique comment utiliser le SDK Admin Identity Platform pour gérer vos utilisateurs par programmation. Le SDK Admin vous permet d'effectuer un large éventail de tâches d'administration courantes, telles que la création, la recherche et la modification de comptes utilisateur.
Avant de commencer
Obtenir un compte utilisateur
Obtenir un compte utilisateur par ID
Le moyen principal d'identifier un utilisateur est d'utiliser son 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}");
Obtenir un compte utilisateur par e-mail
Vous pouvez également obtenir un utilisateur avec son adresse 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}");
Notez que vous ne pouvez effectuer des recherches que par e-mail principal, et non par e-mail spécifique au fournisseur. Par exemple, si un compte Facebook avec l'adresse e-mail facebookUser@example.com
est associé à un utilisateur existant avec l'adresse e-mail user@example.com
, l'appel à getUserByEmail("facebookUser@example.com")
ne donne aucun résultat. L'appel à getUserByEmail("user@example.com")
renvoie l'utilisateur attendu.
L'adresse e-mail principale dépend des paramètres d'association de votre compte :
- Associer des comptes qui utilisent la même adresse e-mail : l'adresse e-mail principale est la première adresse e-mail utilisée pour se connecter, sauf si elle est mise à jour manuellement.
- Créer plusieurs comptes pour chaque fournisseur d'identité : l'adresse e-mail principale n'est définie que lorsqu'un utilisateur de mot de passe est créé, sauf si elle est mise à jour manuellement.
Obtenir un compte utilisateur par numéro de téléphone
Si un utilisateur dispose d'un numéro de téléphone, vous pouvez le rechercher à l'aide de ce numéro :
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}");
Récupérer des informations sur l'utilisateur de manière groupée
Vous pouvez également récupérer une liste d'utilisateurs basée sur les identifiants que vous fournissez. Vous pouvez identifier les utilisateurs par uid, adresse e-mail ou numéro de téléphone. Vous pouvez fournir jusqu'à 100 identifiants par appel. Les identifiants peuvent contenir une combinaison de types :
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}"); }
Cette méthode renvoie une liste de même taille que la liste d'entrée, chaque entrée contenant le champ UserRecord
correspondant ou une erreur, indiquant pourquoi cet identifiant n'a pas pu être recherché.
Répertorier les utilisateurs
Le code ci-dessous indique comment répertorier tous les utilisateurs :
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}"); }
Les utilisateurs sont renvoyés par lots, classés selon leur uid
. Chaque lot de résultats contient une liste d'utilisateurs, ainsi qu'un jeton de page suivant utilisé pour récupérer le lot suivant.
Lorsque tous les utilisateurs ont été répertoriés, aucun résultat pageToken
n'est renvoyé.
Le champ maxResult
spécifie la taille maximale du lot. La valeur par défaut et maximale est de 1 000.
Répertorier les hachages de mot de passe utilisateur
Les hachages de mots de passe étant sensibles, le SDK Admin ne les renvoie pas, sauf si l'utilisateur dispose de l'autorisation firebaseauth.configs.getHashConfig
. Cette autorisation n'est accordée par aucun rôle prédéfini. Pour l'accorder, procédez comme suit :
Créez un rôle personnalisé qui accorde l'autorisation
firebaseauth.configs.getHashConfig
.Accordez le rôle personnalisé à l'utilisateur ou au compte de service.
Les prochains appels à listUsers()
par des utilisateurs dotés de ce rôle personnalisé incluent les champs passwordHash
et passwordSalt
.
Créer un utilisateur
La création d'utilisateurs par programmation évite certaines restrictions imposées aux utilisateurs finaux. Vous n'êtes pas soumis à un ralentissement ni à une limitation du débit, et vous pouvez contourner le processus de validation normal pour les adresses e-mail et les numéros de téléphone.
Pour créer un utilisateur, procédez comme suit :
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}");
Vous pouvez définir toutes les propriétés ci-dessous sur un nouvel utilisateur. Toutes les propriétés sont facultatives.
Valeur | Type | Description |
---|---|---|
uid |
chaîne |
Le uid à attribuer au nouvel utilisateur créé. Doit être une chaîne de 1 à 128 caractères inclus. S'il n'est pas fourni, un uid aléatoire est généré automatiquement.
|
email |
chaîne | Adresse e-mail principale de l'utilisateur. Il doit s'agir d'une adresse e-mail valide. |
emailVerified |
boolean |
Indique si l'adresse e-mail principale de l'utilisateur est validée ou non. Si aucune valeur n'est spécifiée, la valeur par défaut est false .
|
phoneNumber |
chaîne | Numéro de téléphone principal de l'utilisateur. Il doit s'agir d'un numéro de téléphone valide conforme à la norme E.164. |
password |
chaîne | Mot de passe brut non haché de l'utilisateur. Ce champ doit comporter au moins six caractères. |
displayName |
chaîne | Nom à afficher des utilisateurs. |
photoURL |
chaîne | URL de la photo de l'utilisateur. |
disabled |
boolean |
Indique si l'utilisateur est désactivé ou non. true pour désactivé ;
false pour activé. Si cette valeur n'est pas spécifiée, la valeur par défaut est false .
|
Mettre à jour un compte utilisateur
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}");
Vous pouvez mettre à jour n'importe quelle propriété utilisateur ci-dessous. Toutes les propriétés sont facultatives. Si une propriété n'est pas spécifiée, sa valeur reste inchangée.
Valeur | Type | Description |
---|---|---|
email |
chaîne | Nouvelle adresse e-mail principale de l'utilisateur. Il doit s'agir d'une adresse e-mail valide. |
emailVerified |
boolean |
Indique si l'adresse e-mail principale de l'utilisateur est validée ou non. Si aucune valeur n'est spécifiée, la valeur par défaut est false .
|
phoneNumber |
chaîne |
Nouveau numéro de téléphone principal de l'utilisateur. Il doit s'agir d'un numéro de téléphone valide conforme à la norme E.164. Définissez cette valeur sur null pour effacer le numéro de téléphone existant de l'utilisateur.
|
password |
chaîne | Le nouveau mot de passe brut non haché de l'utilisateur. Ce champ doit comporter au moins six caractères. |
displayName |
chaîne | null |
Nouveau nom à afficher de l'utilisateur. Définissez cette valeur sur null pour effacer le nom à afficher existant de l'utilisateur.
|
photoURL |
chaîne | null |
URL de la nouvelle photo de l'utilisateur. Définissez cette valeur sur null pour effacer l'URL de la photo existante de l'utilisateur. S'il ne s'agit pas de null , il doit s'agir d'une URL valide.
|
disabled |
boolean |
Indique si l'utilisateur est désactivé ou non. true pour désactivé ;
false pour activé.
|
Supprimer un compte utilisateur
Vous pouvez supprimer un utilisateur avec son 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.");
Supprimer plusieurs comptes utilisateur
Vous pouvez également supprimer plusieurs comptes utilisateur simultanément :
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}"); }
La méthode de suppression d'utilisateurs renvoie une liste d'échecs pour les utilisateurs qui n'ont pas pu être supprimés.
Étape suivante
- Migrer des utilisateurs d'une application existante vers Identity Platform
- Gérer les fournisseurs SAML et OIDC par programmation