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

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

Zanim zaczniesz

Dodaj do aplikacji obsługę co najmniej 2 dostawców uwierzytelniania (opcjonalnie anonimowe uwierzytelnianie).

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

  1. Zaloguj użytkownika, używając dowolnego dostawcy lub metody uwierzytelniania.
  2. Dokończ proces logowania w nowym dostawcy uwierzytelniania, ale nie wywołuj żadnej z metod FirebaseAuth.signInWith. Możesz na przykład pobrać token identyfikatora Google, token dostępu Facebooka lub adres e-mail i hasło użytkownika.
  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 metodzie 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 funkcji linkWithCredential zakończy się niepowodzeniem, jeśli te dane są już połączone z kontem innego użytkownika. W takiej sytuacji musisz samodzielnie połączyć konta i powiązane z nimi dane w odpowiednim dla Twojej aplikacji sposób:

    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 funkcji linkWithCredential się powiedzie, użytkownik może się zalogować, korzystając z dowolnego połączonego dostawcy uwierzytelniania, i zyskać dostęp do tych samych danych Firebase.

Możesz odłączyć dostawcę uwierzytelniania od konta, aby użytkownik nie mógł się zalogować za jego pomocą.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, prześlij identyfikator dostawcy do metody unlink. Aby uzyskać identyfikatory dostawców usług uwierzytelniania powiązanych z użytkownikiem, wywołaj funkcję 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
                    // ...
                }
            }
        });