Połącz wielu dostawców uwierzytelniania z kontem na Androidzie

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Możesz zezwolić użytkownikom na logowanie się do Twojej aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkowników można zidentyfikować za pomocą tego samego identyfikatora użytkownika Firebase, niezależnie od dostawcy uwierzytelniania, którego użyli do zalogowania. Na przykład użytkownik, który zalogował się przy użyciu hasła, może w przyszłości połączyć konto Google i zalogować się dowolną metodą. Lub anonimowy użytkownik może połączyć konto na Facebooku, a następnie zalogować się za pomocą Facebooka, aby dalej korzystać z aplikacji.

Zanim zaczniesz

Dodaj obsługę co najmniej dwóch dostawców uwierzytelniania (możliwe, że w tym uwierzytelnianie anonimowe) do swojej aplikacji.

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

  1. Zaloguj się użytkownika przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
  2. Zakończ proces logowania dla nowego dostawcy uwierzytelniania, aż do wywołania jednej z metod FirebaseAuth.signInWith , ale nie w tym. Na przykład uzyskaj 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

    Java

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

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Nazwa użytkownika Facebook

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    E-mail-hasło logowania

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Kotlin+KTX

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

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

    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)
                }
            }

    Wywołanie linkWithCredential zakończy się niepowodzeniem, jeśli poświadczenia są już połączone z innym kontem użytkownika. W takiej sytuacji musisz obsłużyć scalanie kont i powiązanych danych odpowiednio do Twojej aplikacji:

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

    Kotlin+KTX

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

Jeśli wywołanie linkWithCredential powiedzie się, użytkownik może teraz 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ę u tego dostawcy.

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

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

Kotlin+KTX

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