2016-06-03 14 views
8

... jeśli nie pozwalają wielu kont z tego samego adresu e-mail , użytkownik nie może utworzyć nowe konto, które znaki w użyciu konto Google z adres e-mail [email protected], jeśli istnieje już konto, które loguje się przy użyciu adresu e-mail [email protected] i hasło .FirebaseAuthInvalidCredentialsException przy użyciu „Jedno konto na adres e-mail”

byłem w stanie zalogować się z dostawcą Google dla tego samego e-mail, który został już zarejestrowany przez dostawcę usług poczty elektronicznej, więc operator Google otrzymuje dostawcy poczty i ostatnia wtedy nie logować się przy FirebaseAuthInvalidCredentialsException: hasło jest nieprawidłowe lub użytkownik nie ma hasła..

Kroki do odtworzenia:

Zarejestruj się z dostawcą mail -> Wyloguj -> Zaloguj się z dostawcą Google -> Wyloguj

Zasadniczo nie powinno to umożliwiać zastąpienia jednego dostawcy innym i rzucać FirebaseAuthUserCollision Wyjątek: adres e-mail jest już używany przez inne konto.

Niektóre kod, który używam na Zarejestruj się/Zarejestruj się:

public void signUpEmail(String email, String password) { 
    mFirebaseAuth.createUserWithEmailAndPassword(email, password) 
     .addOnCompleteListener(this, task -> { 
      if (!task.isSuccessful()) { 
      Log.e("signUpWithEmail", task.getException()); 
      } 
     }); 
    } 

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mFirebaseAuth.signInWithCredential(credential) 
     .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override public void onComplete(@NonNull Task<AuthResult> task) { 
      if (!task.isSuccessful()) { 
      Log.e("signInWithCredential", task.getException()); 
      } 
     } 
    }); 
    } 

    public void signInEmail(String email, String password) { 
    mFirebaseAuth.signInWithEmailAndPassword(email, password) 
     .addOnCompleteListener(this, task -> { 
      if (!task.isSuccessful()) { 
      Log.e("signInWithEmail", task.getException()); 
      } 
     }); 
    } 

    public void signOut() { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
    mFirebaseAuth.signOut(); 
    startSignInActivity(); 
    } 

Dziękujemy!

+1

Wiele prawdopodobnie zależy od kodu tutaj. Coś minimalnego, ale kompletnego, które możesz udostępnić? –

+0

Dodano kod i kilka wyjaśnień. –

Odpowiedz

2

Wiele kont dla każdego adresu e-mail utworzy nowego użytkownika z innym adresem dla różnych dostawców korzystających z tego samego adresu e-mail.

Aby odtworzyć:

  1. Zaloguj się z Google Email x @ x
  2. Zaloguj się z Facebook email x @ x
  3. Załóż konto e-mail hasło x @ x

Teraz dostanie 3 różnych użytkowników.

Jeśli używasz zdecydowanie zalecanych pojedynczych kont dla każdego e-maila, powyższe 3 dostawców będzie w tym samym użytkowniku (jeden użytkownik).

Kiedy po raz pierwszy tworzysz konto Google x @ i próbujesz zalogować się na nowe konto Facebooka za pomocą adresu e-mail x @ x, pojawi się komunikat o błędzie, który jest wymagany, aby kontynuować. Będziesz musiał zalogować się do pierwszego użytkownika Google i połączyć go z nowym użytkownikiem Facebooka.

+0

Dziękuję, chodzi o to, że otrzymałem FirebaseAuthInvalidCredentialsException zamiast łączenia wymaganego błędu, więc nie było jasne, co jest nie tak –

+0

Rozumiem, że teraz rozumiem twoje pytanie. Myślę, że w jednym koncie na e-mail, może to być przeznaczone. Zazwyczaj połączenie będzie uruchamiane po zalogowaniu się przy użyciu tego samego adresu e-mail przy użyciu innego dostawcy. Jest to jednak szczególny przypadek. Ponieważ wiadomości e-mail od Google są weryfikowane, a dostawcy haseł poczty e-mail w tym przypadku nie są, logujesz się bezpośrednio, bez łączenia z kontem e-mail. Jednak sprawdzę, czy usunięty dostawca haseł jest również częścią tego zamierzonego zachowania. – bojeil

3

Aby zoptymalizować kroki interfejsu użytkownika logowania i zwiększyć bezpieczeństwo konta, usługa uwierzytelniania Firebase ma koncepcję "zaufanego dostawcy", w której dostawca tożsamości jest również dostawcą usług poczty e-mail. Na przykład Google jest zaufanym dostawcą adresów @ gmail.com, Yahoo jest zaufanym dostawcą adresów @ yahoo.com i adresami Microsoft for @ outlook.com.

W trybie "Jedno konto na adres e-mail" uwierzytelnianie Firebase próbuje połączyć konto na podstawie adresu e-mail. Jeśli użytkownik loguje się od zaufanego dostawcy, użytkownik natychmiast loguje się do konta, ponieważ wiemy, że użytkownik jest właścicielem adresu e-mail.

Jeśli istnieje konto z tym samym adresem e-mail, ale utworzone z innymi danymi uwierzytelniającymi (np. Hasło lub niezaufany dostawca), poprzednie poświadczenia są usuwane ze względów bezpieczeństwa.

Phisher (który nie jest właścicielem adresu e-mail) może utworzyć konto początkowe - usunięcie początkowego poświadczenia uniemożliwiłoby phisherowi dostęp do konta po nim. Uprawniony użytkownik może ustawić hasło, przechodząc przez proces resetowania hasła, gdzie będzie musiała udowodnić, że jest właścicielem adresu e-mail.

+0

Wydaje mi się, że to wyjaśnia, dlaczego Google Sign In nadpisuje dane uwierzytelniające operatora adresu e-mail. –