2016-06-03 7 views
8

... se non consentono più account con lo stesso e-mail indirizzo, un utente non può creare un nuovo account che i segni in utilizzando un account Google con l' indirizzo email [email protected] se esiste già un account che utilizza l'indirizzo e-mail [email protected] e una password .FirebaseAuthInvalidCredentialsException quando si utilizza "un account per ogni indirizzo e-mail"

sono stato in grado di accedere con provider di Google per la stessa email che è stato già registrato tramite provider di e-mail, in modo da fornitore Google sostituito fornitore di e-mail e quest'ultimo poi non riesce ad accedere con FirebaseAuthInvalidCredentialsException: La password è valida o la l'utente non ha una password..

Procedura per riprodurre:

Iscriviti con provider di e-mail -> Esci -> Accedi con provider di Google -> Esci

Fondamentalmente non dovrebbe permettere di sostituire un fornitore con un altro e lanciare FirebaseAuthUserCollision Eccezione: l'indirizzo email è già utilizzato da un altro account.

Alcuni codice che uso per Entra/Registrati out:

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(); 
    } 

Grazie!

+1

Molto probabilmente dipenderebbe dal codice qui. Qualche cosa minima, ma completa, che puoi condividere? –

+0

Aggiunto un po 'di codice e un paio di chiarimenti. –

risposta

2

Più account per indirizzo e-mail creeranno un nuovo utente con un uid diverso per diversi provider che utilizzano la stessa e-mail.

ricreare:

  1. Accedi con Google email x @ x
  2. Accedi con email facebook x @ x
  3. Crea e-mail password dell'account x @ x

Ora avrò 3 diversi utenti.

Se si utilizzano i singoli account fortemente raccomandati per e-mail, i tre fornitori sopra indicati si troveranno all'interno dello stesso utente (un solo uid).

Quando crei per la prima volta l'account google x @ x e provi ad accedere con un nuovo account Facebook con e-mail x @ x, riceverai un messaggio di errore per il collegamento. Dovrai quindi accedere al primo utente di google e collegare il nuovo utente di Facebook ad esso.

+0

Grazie, il fatto è che stavo ricevendo FirebaseAuthInvalidCredentialsException invece di collegare l'errore richiesto, quindi non era chiaro cosa c'è che non va –

+0

Vedo, capisco la tua domanda ora. Penso che nell'unico account per email, questo possa essere inteso. In genere il collegamento verrebbe attivato quando si effettua l'accesso con la stessa e-mail utilizzando un provider diverso. Tuttavia questo è un caso speciale. Poiché le e-mail di Google sono verificate e in questo caso i provider di password per e-mail non lo sono, accederai direttamente senza effettuare il collegamento al tuo account di posta elettronica. Tuttavia, controllerò se anche il provider di password che si sta eliminando fa parte del comportamento previsto. – bojeil

3

Per ottimizzare l'interfaccia utente di accesso e migliorare la sicurezza dell'account, Firebase Authentication ha un concetto di 'provider di fiducia', in cui il provider di identità è anche il provider di servizi di posta elettronica. Ad esempio, Google è il provider affidabile per gli indirizzi di @ gmail.com, Yahoo è il provider affidabile per gli indirizzi @ yahoo.com e Microsoft per gli indirizzi @ outlook.com.

Nella modalità "Un account per indirizzo di posta elettronica", Firebase Authentication tenta di collegare l'account in base all'indirizzo e-mail. Se un utente accede dal provider di fiducia, l'utente accede immediatamente all'account poiché sappiamo che l'utente possiede l'indirizzo email.

Se esiste un account esistente con lo stesso indirizzo email ma creato con altre credenziali (ad es. Password o provider non attendibile), le credenziali precedenti vengono rimosse per motivi di sicurezza.

Un phisher (che non è il proprietario dell'indirizzo email) potrebbe creare l'account iniziale: rimuovere la credenziale iniziale impedirebbe al phisher di accedere all'account in seguito. L'utente legittimo può impostare una password passando attraverso il flusso di reimpostazione della password, in cui dovrà dimostrare di essere il proprietario dell'indirizzo email.

+0

Credo che questo spieghi perché Google Sign In sovrascrive le credenziali del provider di indirizzi email. –

Problemi correlati