Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkownicy są identyfikowani za pomocą tego samego identyfikatora użytkownika Firebase niezależnie od dostawcy uwierzytelniania, którego użyli do zalogowania się. Użytkownik, który zalogował się za pomocą hasła, może na przykład połączyć konto Google i w przyszłości logować się za pomocą dowolnej z tych metod. Użytkownik anonimowy może też połączyć konto na Facebooku, a potem zalogować się za pomocą Facebooka, aby nadal korzystać z Twojej aplikacji.
Zanim zaczniesz
Dodaj do aplikacji obsługę co najmniej 2 dostawców uwierzytelniania (może to być uwierzytelnianie anonimowe).
Łączenie danych logowania dostawcy uwierzytelniania z kontem użytkownika
Aby połączyć dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika:
- Zaloguj użytkownika za pomocą dowolnego dostawcy lub metody uwierzytelniania.
- Dokończ proces logowania u nowego dostawcy uwierzytelniania, ale nie wywołuj żadnej z metod
FirebaseAuth.signInWith
. Możesz na przykład uzyskać token identyfikatora Google użytkownika, token dostępu do Facebooka lub adres e-mail i hasło. 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);
Przekaż obiekt
AuthCredential
do metodylinkWithCredential
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
linkWithCredential
nie powiedzie się, 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 w sposób odpowiedni dla Twojej aplikacji: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 linkWithCredential
się powiedzie, użytkownik może się zalogować za pomocą dowolnego połączonego dostawcy uwierzytelniania i uzyskać dostęp do tych samych danych Firebase.
Odłączanie dostawcy uwierzytelniania od konta użytkownika
Możesz odłączyć dostawcę uwierzytelniania od konta, aby użytkownik nie mógł się już logować za jego pomocą.
Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do metody unlink
. Identyfikatory dostawców uwierzytelniania powiązanych z użytkownikiem możesz uzyskać, wywołując 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 // ... } } });
Rozwiązywanie problemów
Jeśli podczas próby połączenia kilku kont wystąpią błędy, zapoznaj się z dokumentacją dotyczącą zweryfikowanych adresów e-mail.