Łączenie wielu dostawców uwierzytelniania z kontem na urządzeniu z Androidem

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkownicy są identyfikowani za pomocą tego samego identyfikatora użytkownika Firebase niezależnie od dostawcy uwierzytelniania, którego użyli do zalogowania się. Użytkownik, który zalogował się za pomocą hasła, może na przykład połączyć konto Google i w przyszłości logować się za pomocą dowolnej z tych metod. Użytkownik anonimowy może też połączyć konto na Facebooku, a potem zalogować się za pomocą Facebooka, aby nadal korzystać z Twojej aplikacji.

Zanim zaczniesz

Dodaj do aplikacji obsługę co najmniej 2 dostawców uwierzytelniania (może to być uwierzytelnianie anonimowe).

Aby połączyć dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika:

  1. Zaloguj użytkownika za pomocą dowolnego dostawcy lub metody uwierzytelniania.
  2. Dokończ proces logowania u nowego dostawcy uwierzytelniania, ale nie wywołuj żadnej z metod FirebaseAuth.signInWith. Możesz na przykład uzyskać token identyfikatora Google użytkownika, token dostępu do Facebooka lub adres e-mail i hasło.
  3. Uzyskaj AuthCredential dla nowego dostawcy uwierzytelniania:

    Logowanie przez Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Logowanie przez Facebooka

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Logowanie za pomocą adresu e-mail i hasła

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. Przekaż obiekt AuthCredential do metody linkWithCredential zalogowanego użytkownika:

    Kotlin

    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

    Wywołanie linkWithCredential nie powiedzie się, jeśli dane logowania są już połączone z innym kontem użytkownika. W takiej sytuacji musisz połączyć konta i powiązane z nimi dane w sposób odpowiedni dla Twojej aplikacji:

    Kotlin

    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }

    Java

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

Jeśli wywołanie linkWithCredential się powiedzie, użytkownik może się zalogować za pomocą dowolnego połączonego dostawcy uwierzytelniania i uzyskać dostęp do tych samych danych Firebase.

Jedno konto użytkownika Firebase może być połączone z wieloma dostawcami uwierzytelniania (np. e-mail/hasło, Google, Facebook), co umożliwia użytkownikowi logowanie się na to samo konto Firebase różnymi metodami.

Jeśli odłączysz dostawcę uwierzytelniania od konta użytkownika, nie będzie on już mógł logować się za jego pomocą.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do metody unlink. Identyfikatory dostawców uwierzytelniania powiązanych z użytkownikiem możesz uzyskać, wywołując getProviderData.

Kotlin

Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }

Java

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });

Rozwiązywanie problemów

Jeśli podczas próby połączenia kilku kont wystąpią błędy, zapoznaj się z dokumentacją dotyczącą zweryfikowanych adresów e-mail.