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

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu różnych dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkowników można zidentyfikować na podstawie tego samego identyfikatora użytkownika Firebase niezależnie od dostawcy uwierzytelniania, którego użyli do logowania. Na przykład użytkownik, który zalogował się za pomocą hasła, może w przyszłości połączyć konto Google i zalogować się za pomocą dowolnej z tych metod. Anonimowy użytkownik może też połączyć konto na Facebooku, a potem zalogować się przez Facebooka, aby dalej korzystać z aplikacji.

Zanim zaczniesz

Dodaj do swojej aplikacji obsługę co najmniej 2 dostawców uwierzytelniania (z uwzględnieniem uwierzytelniania anonimowego).

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

  1. Zaloguj użytkownika przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
  2. Wykonaj proces logowania dla nowego dostawcy uwierzytelniania, aż do wywołania jednej z metod FirebaseAuth.signInWith, lecz nie włączając tej metody. Możesz na przykład uzyskać token identyfikatora Google użytkownika, token dostępu Facebooka lub adres e-mail i hasło.
  3. Pobierz AuthCredential dla nowego dostawcy uwierzytelniania:

    Logowanie przez Google

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

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

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Logowanie się za pomocą adresu e-mail

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

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

    Kotlin+KTX

    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 zakończy się niepowodzeniem, 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 odpowiednio do potrzeb aplikacji:

    Kotlin+KTX

    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 będzie mógł zalogować się przy użyciu dowolnego połączonego dostawcy uwierzytelniania i uzyskać dostęp do tych samych danych Firebase.

Możesz odłączyć dostawcę uwierzytelniania od konta, aby użytkownik nie mógł już logować się przez niego.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do metody unlink. Aby uzyskać identyfikatory dostawców uwierzytelniania połączonych z użytkownikiem, wywołaj getProviderData.

Kotlin+KTX

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
                    // ...
                }
            }
        });