使用"每个电子邮件地址一个帐户"时出现FirebaseAuthInvalidCredentialsException

Iva*_*n V 10 android firebase firebase-authentication google-signin

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

我能够使用Google提供商登录已通过电子邮件提供商注册的同一封电子邮件,因此Google提供商更换了电子邮件提供商,后者无法使用FirebaseAuthInvalidCredentialsException登录:密码无效或用户没有密码..

重现步骤:

使用电子邮件提供商注册 - >注销- >使用Google提供商登录 - >退出

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

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

  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();
  }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jin*_*Liu 5

为了优化登录UI步骤并增强帐户安全性,Firebase身份验证具有“受信任的提供程序”的概念,其中身份提供程序也是电子邮件服务提供程序。例如,Google是@ gmail.com地址的受信任提供程序,Yahoo是@ yahoo.com地址的受信任提供程序,而Microsoft是@ outlook.com地址的受信任提供程序。

在“每个电子邮件地址一个帐户”模式下,Firebase身份验证会尝试基于电子邮件地址链接帐户。如果用户从受信任的提供商处登录,则该用户将立即登录该帐户,因为我们知道该用户拥有该电子邮件地址。

如果存在具有相同电子邮件地址但使用其他凭据(例如密码或不受信任的提供者)创建的现有帐户,则出于安全原因,将删除先前的凭据。

仿冒者(不是电子邮件地址所有者)可能会创建初始帐户-删除初始凭据将阻止仿冒者此后访问该帐户。合法用户可以通过密码重置流程来设置密码,在该流程中,她需要证明自己拥有电子邮件地址。


boj*_*eil 2

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

重新创建:

  1. 使用 google 电子邮件 x@x 登录
  2. 使用 Facebook 电子邮件 x@x 登录
  3. 创建邮箱密码账户x@x

现在您将获得 3 个不同的用户。

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

当您首次创建 google 帐户 x@x 并尝试通过电子邮件 x@x 使用新的 Facebook 帐户登录时,您将收到一条错误消息,提示需要链接才能继续。然后,您必须登录第一个 google 用户并将新的 Facebook 用户链接到该用户。