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

时间:2016-06-03 17:03:39

标签: android firebase google-signin firebase-authentication

  

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

我能够使用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();
  }

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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

重新创建:

  1. 使用google email x @ x
  2. 登录
  3. 使用facebook email x @ x
  4. 登录
  5. 创建电子邮件密码帐户x @ x
  6. 现在你将获得3个不同的用户。

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

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