Zarządzanie użytkownikami w Firebase

Tworzenie konta użytkownika

Nowego użytkownika możesz utworzyć na 3 sposoby:

  • Z poziomu 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, np. logowania przez Google, logowania przez Facebooka lub logowania przez Apple.

  • W Firebasekonsoli: utwórz nowego użytkownika uwierzytelnianego hasłem na karcie Zabezpieczenia > Uwierzytelnianie > Użytkownicy.

Pobieranie profilu użytkownika

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

  • Strumienie authStateChanges, idTokenChanges i userChanges: słuchacze otrzymają bieżący User lub 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 logowania użytkownika (jeśli takie istnieją) z pamięci lokalnej. Oznacza to, że Twoje odbiorniki są zawsze wywoływane, gdy stan użytkownika jest inicjowany. Następnie za każdym razem, gdy zmieni się stan uwierzytelniania, zostanie wywołane nowe zdarzenie ze zaktualizowanym stanem użytkownika.

    Monitorując stan uwierzytelniania, możesz utworzyć interfejs użytkownika, który reaguje na te zmiany. Nie umieszczaj authStateChanges().listen(...) bezpośrednio w metodzie build widżetu, ponieważ przy każdej przebudowie utworzy to nową subskrypcję. Jeśli chcesz zaktualizować interfejs 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 widżetów jest automatycznie przebudowywane, gdy zmienia 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 z właściwości currentUser:

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

    currentUser może być null z 2 powodów:

    • Użytkownik nie jest zalogowany.
    • Obiekt uwierzytelniania nie został jeszcze zainicjowany. Jeśli używasz odbiornika 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 użytkowniku, czyli jego nazwę wyświetlaną i adres URL zdjęcia profilowego, możesz aktualizować 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 użytkownikowi e-maila weryfikacyjnego

Możesz wysłać do użytkownika e-maila weryfikacyjnego adresu za pomocą metody sendEmailVerification(). Przykład:

await user?.sendEmailVerification();

Możesz dostosować szablon e-maila używany na karcie Zabezpieczenia > Uwierzytelnianie > Szablony w konsoli Firebase. Zobacz Szablony e-maili w Centrum pomocy Firebase.

Możesz też przekazać stan za pomocą URL-a dalszego działania, aby po wysłaniu e-maila weryfikacyjnego przekierować użytkownika z powrotem do aplikacji.

Możesz też dostosować język 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

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

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

Możesz dostosować szablon e-maila używany na karcie Zabezpieczenia > Uwierzytelnianie > Szablony w konsoli Firebase. Zobacz Szablony e-maili w Centrum pomocy Firebase.

Możesz też przekazać stan za pomocą URL-a dalszego działania, aby po wysłaniu e-maila do zresetowania hasła przekierować użytkownika z powrotem do aplikacji.

Możesz też zlokalizować e-maila z prośbą o zresetowanie hasła, aktualizując kod języka w instancji Auth przed wysłaniem e-maila. Przykład:

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

E-maile z prośbą o zresetowanie hasła możesz też wysyłać z konsoli Firebase.

Usuwanie 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 Zabezpieczenia > Uwierzytelnianie > Użytkownicy.

Ponowne uwierzytelnianie użytkownika

Niektóre działania związane z bezpieczeństwem, takie jak usuwanie konta, ustawianie podstawowego adresu e-mailzmiana hasła, wymagają, aby użytkownik niedawno się zalogował. Jeśli wykonasz jedno z tych działań, a użytkownik zalogował się zbyt dawno, działanie zakończy się niepowodzeniem 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 funkcji 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

Możesz zaimportować konta użytkowników z pliku do projektu w Firebase za pomocą polecenia auth:import wiersza poleceń Firebase. Przykład:

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