Zarządzanie użytkownikami w Firebase

Tworzenie konta użytkownika

Nowe konto użytkownika możesz utworzyć na te sposoby:

  • W aplikacji: utwórz nowego użytkownika w projekcie Firebase, wywołując metodę createUserWithEmailAndPassword() lub logując użytkownika po raz pierwszy za pomocą federacyjnego dostawcy tożsamości, takiego jak Logowanie przez Google, Logowanie przez Facebooka lub Apple.

  • W konsoli Firebase: utwórz nowego użytkownika uwierzytelnianego hasłem na karcie Bezpieczeństwo > Uwierzytelnianie > Użytkownicy.

Pobieranie profilu użytkownika

Aby uzyskać informacje o profilu użytkownika, użyj właściwości User. Obiekt User reprezentujący bieżącego użytkownika możesz uzyskać na 3 sposoby:

  • Strumienie authStateChanges, idTokenChanges i userChanges: Twoi odbiorcy otrzymają bieżący obiekt User lub wartość null, jeśli żaden użytkownik nie jest uwierzytelniony:

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

    Po uruchomieniu aplikacji zdarzenie jest wywoływane po przywróceniu danych uwierzytelniających użytkownika (jeśli istnieją) z pamięci lokalnej. Oznacza to, że odbiorcy są zawsze wywoływani, gdy stan użytkownika jest inicjowany. Następnie, gdy stan uwierzytelniania się zmieni, zostanie wywołane nowe zdarzenie z zaktualizowanym stanem użytkownika.

    Nasłuchując stanu uwierzytelniania, możesz utworzyć interfejs użytkownika, który reaguje na te zmiany stanu uwierzytelniania. Nie umieszczaj authStateChanges().listen(...) bezpośrednio w metodzie build widgetu, ponieważ przy każdej przebudowie utworzy ona nową subskrypcję. Jeśli musisz zaktualizować interfejs użytkownika w odpowiedzi na stan uwierzytelniania, użyj 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);
    },
    )
    

    Dzięki temu drzewo widgetów będzie się automatycznie przebudowywać, gdy zmieni się stan uwierzytelniania użytkownika.

  • Obiekt UserCredential zwracany przez metody uwierzytelniania (signIn-) : obiekt UserCredential ma właściwość user z bieżącym User:

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • Właściwość currentUser instancji FirebaseAuth: jeśli masz pewność, że użytkownik jest obecnie zalogowany, możesz uzyskać dostęp do User za pomocą właściwości currentUserproperty:

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

    Właściwość currentUser może mieć wartość null z 2 powodów:

    • Użytkownik nie jest zalogowany.
    • Obiekt uwierzytelniania nie został jeszcze zainicjowany. Jeśli używasz odbiorcy do śledzenia stanu logowania użytkownika, nie musisz obsługiwać tego przypadku.

Pobieranie informacji o profilu użytkownika specyficznych dla dostawcy

Aby uzyskać informacje o profilu pobrane od dostawców logowania połączonych z użytkownikiem, użyj właściwości providerData. Przykład:

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

Aktualizowanie profilu użytkownika

Podstawowe informacje o profilu użytkownika – nazwę wyświetlaną i adres URL zdjęcia profilowego – możesz zaktualizować za pomocą metod update. Przykład:

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

Ustawianie adresu e-mail użytkownika

Adres e-mail użytkownika możesz ustawić za pomocą metody updateEmail(). Przykład:

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

Wysyłanie do użytkownika e-maila weryfikacyjnego

Do użytkownika możesz wysłać e-maila z prośbą o weryfikację adresu za pomocą metody sendEmailVerification(). Przykład:

await user?.sendEmailVerification();

Możesz dostosować, którego szablonu e-maila użyć, na karcie Bezpieczeństwo > Uwierzytelnianie > Szablony w konsoli Firebase. Zobacz Szablony e-maili w Centrum pomocy Firebase.

Podczas wysyłania e-maila weryfikacyjnego możesz też przekazać stan za pomocą adresu URL kontynuacji, aby przekierować użytkownika z powrotem do aplikacji.

Dodatkowo możesz zlokalizować e-maila weryfikacyjnego, aktualizując kod języka w instancji Auth przed wysłaniem e-maila. Przykład:

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

Ustawianie hasła użytkownika

Hasło użytkownika możesz ustawić za pomocą metody updatePassword(). Przykład:

await user?.updatePassword(newPassword);

Wysyłanie e-maila do resetowania hasła

Do użytkownika możesz wysłać e-maila z prośbą o zresetowanie hasła za pomocą metody sendPasswordResetEmail(). Przykład:

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

Możesz dostosować, którego szablonu e-maila użyć, na karcie Bezpieczeństwo > Uwierzytelnianie > Szablony w konsoli Firebase. Zobacz Szablony e-maili w Centrum pomocy Firebase.

Podczas wysyłania e-maila do resetowania hasła możesz też przekazać stan za pomocą adresu URL kontynuacji, aby przekierować użytkownika z powrotem do aplikacji.

Dodatkowo możesz zlokalizować e-maila do resetowania hasła, aktualizując kod języka w instancji Auth przed wysłaniem e-maila. Przykład:

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

E-maile do resetowania hasła możesz też wysyłać z konsoli Firebase.

Usuwanie konta użytkownika

Konto użytkownika możesz usunąć za pomocą metody delete(). Przykład:

await user?.delete();

Użytkowników możesz też usuwać w konsoli Firebase na karcie Bezpieczeństwo > Uwierzytelnianie > Użytkownicy.

Ponowne uwierzytelnianie użytkownika

Niektóre działania wymagające zachowania szczególnych środków bezpieczeństwa, takie jak usuwanie konta, ustawianie głównego adresu e-mail i zmienianie hasła, wymagają, aby użytkownik był niedawno zalogowany. Jeśli wykonasz jedno z tych działań, a użytkownik zalogował się zbyt dawno, działanie nie powiedzie się i zostanie zgłoszony wyjątek FirebaseAuthException z kodem requires-recent-login. W takim przypadku ponownie uwierzytelnij użytkownika, uzyskując od niego nowe dane logowania i przekazując je do reauthenticate. Przykład:

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

Importowanie kont użytkowników

Konta użytkowników możesz importować z pliku do projektu Firebase za pomocą polecenia auth:import w interfejsie wiersza poleceń Firebase. Przykład:

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