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

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 się. 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 Facebook, 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. Ukończyć logowania przepływu dla nowego dostawcy uwierzytelniania w górę, ale nie w tym, nazywając jedną z FirebaseAuth.signInWith metod. Na przykład uzyskaj token identyfikatora Google użytkownika, token dostępu do Facebooka lub adres e-mail i hasło.
  3. Otrzymuj AuthCredential dla nowego dostawcy uwierzytelniania:

    Logowanie przez Google

    Jawa

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

    Kotlin+KTX

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

    Jawa

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

    Kotlin+KTX

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

    Jawa

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

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)
  4. Przepuścić AuthCredential sprzeciw wobec zalogowanych użytkownika linkWithCredential metody:

    Jawa

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

    Wezwanie do linkWithCredential zawiedzie, 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:

    Jawa

    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, użytkownik może teraz zalogować się przy użyciu dowolnych połączonych dostawcy uwierzytelniania i 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ć od dostawcy uwierzytelniania konta użytkownika, należy przekazać identyfikator dostawcy do unlink metody. Można uzyskać identyfikatory dostawcą dostawców auth powiązanych z użytkownikiem poprzez wywołanie getProviderData .

Jawa

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