Możesz zezwolić użytkownikom na logowanie się do 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 rozpoznać po tym samym identyfikatorze 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, będzie mógł w przyszłości połączyć konto Google i logować 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ę dwóch lub większej liczby dostawców uwierzytelniania (prawdopodobnie włączając uwierzytelnianie anonimowe) do swojej aplikacji.
Połącz poświadczenia dostawcy uwierzytelniania z kontem użytkownika
Aby połączyć poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika:
- Zaloguj się przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
- Ukończ proces logowania dla nowego dostawcy uwierzytelniania, aż do wywołania jednej z metod
FirebaseAuth.signInWith
, ale nie włącznie. Na przykład uzyskaj token identyfikatora Google użytkownika, token dostępu do Facebooka lub adres e-mail i hasło. Uzyskaj
AuthCredential
dla nowego dostawcy uwierzytelniania:Zaloguj się przez Google
Kotlin+KTX
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
Java
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
Nazwa użytkownika Facebook
Kotlin+KTX
val credential = FacebookAuthProvider.getCredential(token.token)
Java
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
Logowanie za pomocą hasła e-mail
Kotlin+KTX
val credential = EmailAuthProvider.getCredential(email, password)
Java
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
Przekaż obiekt
AuthCredential
do metodylinkWithCredential
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 poświadczenia są już połączone z innym kontem użytkownika. W tej sytuacji musisz zająć się łączeniem kont i powiązanych danych odpowiednio do swojej 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
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.
Odłącz dostawcę uwierzytelniania od konta użytkownika
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
. Możesz uzyskać identyfikatory dostawców uwierzytelniania połączonych z użytkownikiem, wywołując metodę 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 // ... } } });