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
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
Logowanie przez Facebooka
val credential = FacebookAuthProvider.getCredential(token.token)
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
Logowanie za pomocą adresu e-mail i hasła
val credential = EmailAuthProvider.getCredential(email, password)
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
Przekaż obiekt
AuthCredential
metodzielinkWithCredential
zalogowanego użytkownika: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) } }
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:val prevUser = auth.currentUser auth.signInWithCredential(credential) .addOnSuccessListener { result -> val currentUser = result.user // Merge prevUser and currentUser accounts and data // ... } .addOnFailureListener { // ... }
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
.
Firebase.auth.currentUser!!.unlink(providerId) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Auth provider unlinked from account // ... } }
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 // ... } } });