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).
Łączenie danych logowania dostawcy uwierzytelniania z kontem użytkownika
Aby połączyć dane logowania dostawcy uwierzytelniania z dotychczasowym kontem użytkownika:
- Zaloguj użytkownika, używając dowolnego dostawcy lub metody uwierzytelniania.
- 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. 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
metodzielinkWithCredential
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.
Odłączanie dostawcy uwierzytelniania od konta użytkownika
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 // ... } } });