当前位置: 首页 > 知识库问答 >
问题:

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

倪阳飇
2023-03-14

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

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

重现步骤:

向电子邮件提供商注册-

基本上,它不应该允许用另一个提供商替换一个提供商并抛出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();
  }

谢谢大家!

共有2个答案

洪博涛
2023-03-14

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

要重新创建:

  1. 使用谷歌电子邮件x@x登录
  2. 使用脸书电子邮件x@x登录
  3. 创建电子邮件密码帐户x@x

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

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

当您第一次创建google帐户x@x并尝试使用电子邮件x@x登录新的facebook帐户时,您将收到一个错误,即需要链接才能继续。然后,您必须登录第一个google用户并将新facebook用户链接到它。

林君博
2023-03-14

为了优化登录UI步骤并增强帐户安全性,Firebase Authentication具有“可信提供者”的概念,其中身份提供者也是电子邮件服务提供者。例如,谷歌是@gmail的可信提供商。com地址,雅虎是@Yahoo的可信提供商。com地址和Microsoft for@outlook。com地址。

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

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

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

 类似资料:
  • 在Firebase控制台中,我特别将其设置为只允许“每个电子邮件地址一个帐户”。这可以在“高级”下的“登录方法”选项卡上找到。 我有一个使用谷歌登录方法创建的帐户,它有一个类似“me@gmail.com”的地址。如果我选择通过Facebook使用一个也使用“me@gmail.com”的帐户登录,Firebase允许它,但用户实体中的电子邮件地址为空除外。 Firebase文档指出: 如果不允许使用

  • 我的客户正在使用IMAP使用Outlook for Web中的“连接帐户”将一个Office365电子邮件帐户连接到另一个。当这样做时,它失败了,错误是它不能连接到帐户。帐户无法通过“不安全”方法连接,手动键入IMAP设置时也无法工作。Office365电子邮件帐户在不同的Office365帐户上,但我怀疑当他们在同一个Office365帐户上时也会发生这种情况。 我把这个问题作为一个问题发布,然

  • 在我的公司,我们正在实现DocuSign的一些部分,并且遇到了一个我们认为restapi不支持的场景。 有时我们系统中的用户会更改电子邮件地址。我们希望为用户将此更改推送到DocuSign,而无需用户登录DocuSign并通过控制台手动更改他们的电子邮件地址。当然,这会更改用户在DocuSign的登录页面上进行身份验证的用户名。 是否可以使用DocuSign REST API更改用户的电子邮件地址

  • 您可以通过此界面创建和管理域的电子邮件帐户。 您可以创建电子邮件地址,配置邮件客户端,更改密码以及直接访问您的Webmail。 创建电子邮件地址 要为您的域创建电子邮件地址,请按以下步骤操作 - Step 1 - 单击cPanel主页的“电子邮件”部分中的“ Email Accounts链接。 Step 2 - 在电子邮件帐户中,您会在顶部找到添加电子邮件帐户。 Step 3 - 添加您要创建的电

  • 我两个应用程序:一个给卖家,一个给客户。数据库是Firestore,我想使用Firebase Auth来处理身份验证。如果一个卖家也想成为同一电子邮件地址下的客户,我如何在Firebase Auth中设置这个?例如,exampleName@gmail.com已经在卖家应用程序中注册,并调用createUserWithEmailAndPassword方法来创建他的帐户。但当他想在客户的app中以客户