使用“每个电子邮件地址一个帐户”时FirebaseAuthInvalidCredentialsException

…如果您不允许多个帐户使用同一个电子邮件地址,则用户无法创build一个新帐户,该帐户使用电子邮件地址为ex@gmail.com的Google帐户login(如果已有帐户使用login电子邮件地址ex@gmail.com和一个密码。

我可以通过Google提供商login与通过电子邮件提供商注册的电子邮件相同的电子邮件,因此Google提供商取代了电子邮件提供商,而后者则无法使用FirebaseAuthInvalidCredentialsExceptionlogin:密码无效或用户没有密码。

重现步骤:

使用电子邮件提供商 注册 – >退出 – >使用Google提供商 login – >退出

基本上它不应该允许replace另一个提供者,并抛出FirebaseAuthUserCollisionException:该电子邮件地址已被另一个帐户使用。

我用于login/注销的一些代码:

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

谢谢!

Solutions Collecting From Web of "使用“每个电子邮件地址一个帐户”时FirebaseAuthInvalidCredentialsException"

每个电子邮件地址的多个帐户将为使用同一电子邮件的不同供应商创build一个具有不同uid的新用户。

要重新创build:

  1. 用谷歌电邮loginx @ x
  2. 用Facebook电子邮件地址loginx @ x
  3. 创build电子邮件密码帐户x @ x

现在你会得到3个不同的用户。

如果您使用每个电子邮件强烈推荐的单个帐户,则上述3个提供商将位于同一个用户(一个用户)中。

当您第一次创buildGoogle帐户x @ x并尝试使用电子邮件x @ xlogin新的Facebook帐户时,您将收到一个错误,需要进行链接。 然后,您必须login第一个谷歌用户,并将新的Facebook用户链接到它。

为优化loginUI步骤和增强帐户安全性,Firebase身份validation具有“可信提供商”的概念,身份提供商也是电子邮件服务提供商。 例如,Google是@ gmail.com地址的受信任提供者,Yahoo是@ yahoo.com地址的可信提供者,Microsoft是@ outlook.com地址的可信提供者。

在“每个电子邮件地址一个帐户”模式下,Firebase身份validation会尝试根据电子邮件地址关联帐户。 如果用户从受信任的提供者login,则用户立即login该帐户,因为我们知道用户拥有该电子邮件地址。

如果存在具有相同电子邮件地址但是使用其他凭证(例如密码或不可信提供者)创build的现有账户,则出于安全原因移除先前的凭证。

networking钓鱼者(不是电子邮件地址所有者)可能会创build初始帐户 – 删除初始凭证会阻止networking钓鱼者之后访问帐户。 合法用户可以通过密码重置stream程来设置密码,在那里她需要certificate她拥有电子邮件地址。