Uwierzytelnianie za pomocą Firebase za pomocą kont opartych na haśle na Androidzie

Za pomocą Firebase Authentication możesz zezwolić użytkownikom na uwierzytelnianie się w Firebase przy użyciu adresów e-mail i haseł oraz zarządzać kontami opartymi na hasłach w aplikacji.

Zanim zaczniesz

  1. Jeśli jeszcze tego nie zrobiono, dodaj Firebase do projektu na Androida.

  2. Jeśli nie masz jeszcze połączonej aplikacji z projektem Firebase, zrób to w konsoli Firebase.
  3. Włącz logowanie za pomocą adresu e-mail i hasła:
    1. W konsoli Firebase otwórz sekcję Autoryzacja.
    2. Na karcie Metoda logowania włącz metodę logowania Adres e-mail i hasło, a następnie kliknij Zapisz.
  4. pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts lub <project>/<app-module>/build.gradle) dodaj zależność z biblioteką Firebase Authentication na Androida. Zalecamy używanie Firebase Android BoM do kontrolowania wersji biblioteki.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.10.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    Gdy korzystasz z Firebase Android BoM, aplikacja zawsze używa zgodnych wersji bibliotek Firebase na Androida.

    Jeśli zdecydujesz się nie używać Firebase BoM, musisz podać każdą wersję biblioteki Firebase w jej wierszu zależności.

    Jeśli w aplikacji używasz kilku bibliotek Firebase, zdecydowanie zalecamy korzystanie z BoM do zarządzania wersjami bibliotek. Dzięki temu wszystkie wersje będą ze sobą zgodne.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.2.0")
    }
    Szukasz modułu biblioteki dla Kotlina? Od października 2023 r. (Firebase BoM 32.5.0) deweloperzy Kotlina i Java mogą korzystać z głównego modułu biblioteki (szczegółowe informacje znajdziesz w często zadawanych pytaniach dotyczących tej inicjatywy).

Tworzenie konta z hasłem

Aby utworzyć nowe konto użytkownika z hasłem, wykonaj te czynności w sekcji Aktywność logowania w aplikacji:

  1. W metodzie onCreate aktywności rejestracji pobierz współdzielony obiekt FirebaseAuth:
    KotlinJava
    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth
    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. Podczas inicjowania aktywności sprawdź, czy użytkownik jest obecnie zalogowany:
    KotlinJava
    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }
    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Gdy nowy użytkownik zarejestruje się w aplikacji, wykonaj nowe czynności weryfikacyjne konta wymagane przez aplikację, np. sprawdź, czy hasło do nowego konta zostało poprawnie wpisane i czy spełnia wymagania dotyczące złożoności.
  4. Utwórz nowe konto, przekazując adres e-mail i hasło nowego użytkownika do funkcji createUserWithEmailAndPassword:
    KotlinJava
    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }
    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Jeśli zostało utworzone nowe konto, użytkownik jest też zalogowany. W wywołaniu zwrotnym możesz użyć metody getCurrentUser, aby pobrać dane konta użytkownika.

Logowanie użytkownika z adresem e-mail i hasłem

Logowanie użytkownika za pomocą hasła przebiega podobnie jak tworzenie nowego konta. W działaniu logowania aplikacji:

  1. W metodzie onCreate aktywności logowania się pobierz udostępniony obiekt FirebaseAuth:
    KotlinJava
    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth
    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. Podczas inicjowania aktywności sprawdź, czy użytkownik jest obecnie zalogowany:
    KotlinJava
    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }
    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Gdy użytkownik zaloguje się w aplikacji, prześlij jego adres e-mail i hasło do funkcji signInWithEmailAndPassword:
    KotlinJava
    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }
    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Jeśli udało się zalogować, możesz użyć zwróconego FirebaseUser, aby kontynuować.

Zalecane: skonfiguruj zasady dotyczące haseł

Możesz zwiększyć bezpieczeństwo konta, egzekwując wymogi dotyczące złożoności haseł.

Aby skonfigurować zasadę dotyczącą haseł w projekcie, otwórz kartę Zasady dotyczące haseł na stronie Ustawienia uwierzytelniania w konsoli Firebase:

Ustawienia uwierzytelniania

Firebase Authentication zasady dotyczące haseł obsługują te wymagania dotyczące haseł:

  • Wymagane są małe litery

  • Wymagany jest znak w wielkiej literze

  • Wymagany znak liczbowy

  • Wymagany znak niealfanumeryczny

    Te znaki spełniają wymagania dotyczące znaków niealfanumerycznych:^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • Minimalna długość hasła (od 6 do 30 znaków; domyślnie 6)

  • Maksymalna długość hasła (maksymalnie 4096 znaków)

Możesz włączyć egzekwowanie zasad dotyczących haseł w 2 trybach:

  • Wymagaj: logowanie nie będzie możliwe, dopóki użytkownik nie zmieni hasła zgodnie z zasadami.

  • Powiadomienie: użytkownicy mogą się rejestrować przy użyciu hasła, które nie spełnia wymogów. Korzystając z tego trybu, sprawdź, czy hasło użytkownika jest zgodne z zasadami po stronie klienta, i poproś użytkownika o zmianę hasła, jeśli nie jest ono zgodne z zasadami.

Nowi użytkownicy muszą zawsze wybrać hasło zgodne z Twoimi zasadami.

Jeśli masz aktywnych użytkowników, nie zalecamy włączania wymuszania aktualizacji podczas logowania, chyba że zamierzasz zablokować dostęp użytkownikom, których hasła nie są zgodne z Twoimi zasadami. Zamiast tego użyj trybu informowania, który pozwala użytkownikom na logowanie się za pomocą bieżących haseł i informuje ich o wymaganiach, których ich hasło nie spełnia.

Zalecane: włącz ochronę przed wyliczaniem adresów e-mail

Niektóre metody Firebase Authentication, które przyjmują adresy e-mail jako parametry, zgłaszają określone błędy, jeśli adres e-mail jest niezarejestrowany, gdy musi być zarejestrowany (np. podczas logowania się za pomocą adresu e-mail i hasła), lub zarejestrowany, gdy musi być nieużywany (np. podczas zmiany adresu e-mail użytkownika). Może to być przydatne, jeśli chcesz zaproponować użytkownikom konkretne rozwiązania, ale może też zostać wykorzystane przez osoby o złych zamiarach do wykrycia adresów e-mail zarejestrowanych przez Twoich użytkowników.

Aby zmniejszyć to ryzyko, zalecamy włączenie ochrony przed wyliczaniem adresów e-mail w projekcie za pomocą narzędzia gcloud Google Cloud. Pamiętaj, że włączenie tej funkcji zmienia sposób raportowania błędów przez Firebase Authentication: upewnij się, że aplikacja nie opiera się na bardziej szczegółowych błędach.

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania, za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane w projekcie Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w projekcie, niezależnie od tego, jak użytkownik się loguje.

  • W swoich aplikacjach możesz pobrać podstawowe informacje o profilu użytkownika z obiektu FirebaseUser. Zobacz sekcję Zarządzanie użytkownikami.

  • W regułach Firebase Realtime DatabaseCloud Storage Regułach bezpieczeństwa możesz pobrać z zmiennej auth unikalny identyfikator zalogowanego użytkownika i używać go do kontrolowania dostępu użytkownika do danych.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą danych uwierzytelniających od różnych dostawców, łącząc je z dotychczasowym kontem użytkownika.

Aby wylogować użytkownika, wywołaj funkcję signOut:

KotlinJava
Firebase.auth.signOut()
FirebaseAuth.getInstance().signOut();