Gérer les utilisateurs dans Firebase

Créer un compte utilisateur

Vous pouvez créer un compte utilisateur dans votre projet Firebase de quatre manières :

  • Appelez la méthode createUserWithEmailAndPassword().
  • Connectez un utilisateur pour la première fois à l'aide d'un fournisseur d'identité fédéré, tel que Se connecter avec Google, Facebook Login ou Apple.

Vous pouvez également créer des utilisateurs authentifiés par mot de passe dans la section "Authentication" (Authentification) de la console Firebase, sur la page "Users" (Utilisateurs).

Obtenir le profil d'un utilisateur

Pour obtenir les informations de profil d'un utilisateur, utilisez les propriétés de User. Vous pouvez obtenir un objet User représentant l'utilisateur actuel de trois manières :

  • Les flux authStateChanges, idTokenChanges et userChanges : vos écouteurs recevront l'objet User actuel ou null si aucun utilisateur n'est authentifié :

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

    Au démarrage de l'application, un événement se déclenche une fois que les identifiants de l'utilisateur (le cas échéant) ont été restaurés à partir du stockage local. Cela signifie que vos écouteurs sont toujours appelés lorsque l'état de l'utilisateur est initialisé. Ensuite, chaque fois que l'état d'authentification change, un nouvel événement est déclenché avec l'état de l'utilisateur mis à jour.

    En écoutant l'état d'authentification, vous pouvez créer une interface utilisateur qui réagit à ces changements d'état. Ne placez pas authStateChanges().listen(...) directement dans la méthode de compilation d'un widget, car cela créera un nouvel abonnement à chaque recompilation. Si vous devez mettre à jour l'interface utilisateur en réponse à l'état d'authentification, utilisez un StreamBuilder :

    StreamBuilder<User?>(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
      if (snapshot.hasError) {
        return const Text('Something went wrong');
      }
    
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text("Loading...");
      }
    
      if (!snapshot.hasData) {
        return const SignInScreen();
      }
    
      final user = snapshot.data!;
      return HomeScreen(userId: user.uid);
    },
    )
    

    Cette approche garantit que l'arborescence des widgets se recompilera automatiquement lorsque l'état d'authentification de l'utilisateur changera.

  • L'objet UserCredential renvoyé par les méthodes d'authentification (signIn-) : l'objet UserCredential possède une propriété user avec l'objet User actuel :

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • La propriété currentUser de l'instance FirebaseAuth : si vous êtes sûr que l' utilisateur est actuellement connecté, vous pouvez accéder à l'objet User à partir de la propriété currentUser :

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    La propriété currentUser peut être null pour deux raisons :

    • L'utilisateur n'est pas connecté.
    • L'objet d'authentification n'a pas terminé son initialisation. Si vous utilisez un écouteur pour suivre l'état de connexion de l'utilisateur, vous n'avez pas besoin de gérer ce cas.

Obtenir les informations de profil spécifiques au fournisseur d'un utilisateur

Pour obtenir les informations de profil récupérées auprès des fournisseurs de connexion associés à un utilisateur, utilisez la propriété providerData. Exemple :

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

Mettre à jour le profil d'un utilisateur

Vous pouvez mettre à jour les informations de profil de base d'un utilisateur (son nom à afficher et l'URL de sa photo de profil) à l'aide des méthodes update-. Exemple :

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

Définir l'adresse e-mail d'un utilisateur

Vous pouvez définir l'adresse e-mail d'un utilisateur à l'aide de la méthode updateEmail(). Exemple :

await user?.updateEmail("janeq@example.com");

Envoyer un e-mail de validation à un utilisateur

Vous pouvez envoyer un e-mail de validation d'adresse à un utilisateur à l'aide de la méthode sendEmailVerification(). Exemple :

await user?.sendEmailVerification();

Vous pouvez personnaliser le modèle d'e-mail utilisé dans la section "Authentication" (Authentification) de la console Firebase, sur la page "Email Templates" (Modèles d'e-mail). Consultez Modèles d'e-mail dans le Centre d'aide Firebase.

Il est également possible de transmettre un état via une URL de continuation pour rediriger l'utilisateur vers l'application lors de l'envoi d'un e-mail de validation.

Vous pouvez également localiser l'e-mail de validation en mettant à jour le code de langue sur l'instance d'authentification avant d'envoyer l'e-mail. Exemple :

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

Définir le mot de passe d'un utilisateur

Vous pouvez définir le mot de passe d'un utilisateur à l'aide de la méthode updatePassword(). Exemple :

await user?.updatePassword(newPassword);

Envoyer un e-mail de réinitialisation du mot de passe

Vous pouvez envoyer un e-mail de réinitialisation du mot de passe à un utilisateur à l'aide de la méthode sendPasswordResetEmail(). Exemple :

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

Vous pouvez personnaliser le modèle d'e-mail utilisé dans la section "Authentication" (Authentification) de la console Firebase, sur la page "Email Templates" (Modèles d'e-mail). Consultez Modèles d'e-mail dans le Centre d'aide Firebase.

Il est également possible de transmettre un état via une URL de continuation pour rediriger l'utilisateur vers l'application lors de l'envoi d'un e-mail de réinitialisation du mot de passe.

Vous pouvez également localiser l'e-mail de réinitialisation du mot de passe en mettant à jour le code de langue sur l'instance d'authentification avant d'envoyer l'e-mail. Exemple :

await FirebaseAuth.instance.setLanguageCode("fr");

Vous pouvez également envoyer des e-mails de réinitialisation du mot de passe depuis la console Firebase.

Supprimer un compte utilisateur

Vous pouvez supprimer un compte utilisateur à l'aide de la méthode delete(). Exemple :

await user?.delete();

Vous pouvez également supprimer des utilisateurs dans la section "Authentication" (Authentification) de la console Firebase, sur la page "Users" (Utilisateurs).

Réauthentifier un utilisateur

Certaines actions sensibles en termes de sécurité, telles que la suppression d'un compte, la définition d'une adresse e-mail principale, et la modification d'un mot de passe—nécessitent que l'utilisateur se soit connecté récemment. Si vous effectuez l'une de ces actions et que l'utilisateur s'est connecté il y a trop longtemps, l'action échoue et génère une FirebaseAuthException avec le code requires-recent-login. Dans ce cas, réauthentifiez l'utilisateur en obtenant de nouveaux identifiants de connexion et en les transmettant à reauthenticate. Exemple :

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

Importer des comptes utilisateur

Vous pouvez importer des comptes utilisateur à partir d'un fichier dans votre projet Firebase à l'aide de la commande auth:import de la CLI Firebase. Exemple :

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14