Gestisci gli utenti in Firebase

Crea un utente

Puoi creare un nuovo utente nel tuo progetto Firebase in quattro modi:

  • Chiama il metodo createUserWithEmailAndPassword().
  • Accedi per la prima volta come utente utilizzando un provider di identità federata, come Accedi con Google, Accesso con Facebook o Apple.

Puoi anche creare nuovi utenti autenticati con password dalla sezione Autenticazione della console Firebase, nella pagina Utenti.

Ottenere il profilo di un utente

Per ottenere le informazioni del profilo di un utente, utilizza le proprietà di User. Esistono tre modi per ottenere un oggetto User che rappresenta l'utente corrente:

  • Gli stream authStateChanges, idTokenChanges e userChanges: i tuoi ascoltatori riceveranno l'User corrente o l'null se nessun utente è autenticato:

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

    All'avvio dell'app, viene attivato un evento dopo il ripristino delle credenziali utente (se presenti) dallo spazio di archiviazione locale, il che significa che i listener vengono sempre chiamati quando lo stato utente viene inizializzato. Poi, ogni volta che lo stato di autenticazione cambia, viene generato un nuovo evento con lo stato utente aggiornato.

    Ascoltando lo stato di autenticazione, puoi creare un'interfaccia utente che reagisce a queste modifiche dello stato di autenticazione. Non inserire authStateChanges().listen(...) direttamente all'interno del metodo di creazione di un widget, in quanto verrà creata una nuova iscrizione a ogni ricompilazione. Se devi aggiornare la UI in risposta allo stato di autenticazione, utilizza 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);
    },
    )
    

    Questo approccio garantisce la ricostruzione automatica dell'albero dei widget quando lo stato di autenticazione dell'utente cambia.

  • L'oggetto UserCredential restituito dai metodi di autenticazione (signIn-) l'oggetto UserCredential ha una proprietà user con l'attuale User:

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • La proprietà currentUser dell'istanza FirebaseAuth: se hai la certezza che l'utente abbia eseguito l'accesso, puoi accedere a User dalla proprietà currentUser:

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

    Il currentUser può essere null per due motivi:

    • L'utente non ha eseguito l'accesso.
    • L'inizializzazione dell'oggetto di autenticazione non è stata completata. Se utilizzi un listener per monitorare lo stato di accesso dell'utente, non devi gestire questo caso.

Ottenere le informazioni del profilo specifiche del fornitore di un utente

Per ottenere le informazioni del profilo recuperate dai provider di accesso collegati a un utente, utilizza la proprietà providerData. Ad esempio:

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;
    }
}

Aggiornare il profilo di un utente

Puoi aggiornare le informazioni di base del profilo di un utente, ovvero il nome visualizzato e l'URL della foto del profilo, con i metodi update. Ad esempio:

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

Impostare l'indirizzo email di un utente

Puoi impostare l'indirizzo email di un utente con il metodo updateEmail(). Ad esempio:

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

Inviare un'email di verifica a un utente

Puoi inviare un'email di verifica dell'indirizzo a un utente con il metodo sendEmailVerification(). Ad esempio:

await user?.sendEmailVerification();

Puoi personalizzare il modello di email utilizzato nella sezione Autenticazione della Console Firebase, nella pagina Modelli email. Consulta Modelli email nel Centro assistenza Firebase.

È anche possibile passare lo stato tramite un URL di continuazione per reindirizzare l'utente all'app quando invia un'email di verifica.

Inoltre, puoi localizzare l'email di verifica aggiornando il codice della lingua nell'istanza Auth prima di inviare l'email. Ad esempio:

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

Impostare la password di un utente

Puoi impostare la password di un utente con il metodo updatePassword(). Ad esempio:

await user?.updatePassword(newPassword);

Inviare un'email di reimpostazione della password

Puoi inviare un'email di reimpostazione della password a un utente con il metodo sendPasswordResetEmail(). Ad esempio:

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

Puoi personalizzare il modello di email utilizzato nella sezione Autenticazione della Console Firebase, nella pagina Modelli email. Consulta Modelli email nel Centro assistenza Firebase.

È anche possibile passare lo stato tramite un URL di continuazione per reindirizzare l'utente all'app quando invia un'email di reimpostazione della password.

Inoltre, puoi localizzare l'email di reimpostazione della password aggiornando il codice della lingua nell'istanza Auth prima di inviare l'email. Ad esempio:

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

Puoi anche inviare email di reimpostazione della password dalla console Firebase.

Eliminare un utente

Puoi eliminare un account utente con il metodo delete(). Ad esempio:

await user?.delete();

Puoi anche eliminare gli utenti dalla sezione Autenticazione della console Firebase, nella pagina Utenti.

Eseguire nuovamente l'autenticazione di un utente

Alcune azioni sensibili alla sicurezza, come l'eliminazione di un account, l'impostazione di un indirizzo email principale e la modifica di una password, richiedono che l'utente abbia eseguito l'accesso di recente. Se esegui una di queste azioni e l'utente ha eseguito l'accesso troppo tempo fa, l'azione non va a buon fine e viene generato un FirebaseAuthException con il codice requires-recent-login. In questo caso, esegui nuovamente l'autenticazione dell'utente ottenendo nuove credenziali di accesso e trasmettendole a reauthenticate. Ad esempio:

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

Importare account utente

Puoi importare gli account utente da un file nel tuo progetto Firebase utilizzando il comando auth:import della CLI Firebase. Ad esempio:

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