Android Firebase将多个帐户提供商与匹配的电子邮件相关联

时间:2017-05-23 03:59:43

标签: android facebook firebase google-api firebase-authentication

在我的firebase信息中心中,我设置了multiple accounts for one email选项。

我的应用程序中有简单的电子邮件,Facebook和Google Plus身份验证。

我在LoginActivity中处理这些内容:

Google Plus:

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    dialog.dismiss();
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = mAuth.getCurrentUser();
                        proceed();
                    } else {
                        // If sign in fails, display a message to the user.
                        Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                Toast.LENGTH_SHORT).show();

                    }

                    // ...
                }
            });
}

Facebook的:

private void handleFacebookAccessToken(AccessToken token) {
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    dialog.show();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    dialog.dismiss();
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = mAuth.getCurrentUser();
                        proceed();
                    } else {
                        Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                Toast.LENGTH_SHORT).show();
                    }

                }
            });

}

简单电子邮件:

mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        dialog.dismiss();
                        proceed();
                    } else {
                        Toast.makeText(LoginActivity.this, "Wrong email or password", Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                }
            });

现在,我希望让拥有相同电子邮件的用户能够通过Facebook和Google Plus对Facebook和Google Plus进行授权。

this documentation文档说我应该跳过FirebaseAuth.signInWith方法并调用这些函数:

AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
mAuth.getCurrentUser().linkWithCredential(credential)

现在令人困惑。 当我仍然为null时,如何调用getCurrentUser,因为我跳过了signInWith方法?

文档还说我处理了我不理解的合并。

currentUser = auth.signInWithCredential(credential).await().getUser();

此外,signInWithCredenial没有await方法。

这意味着我应该在登录后使用相同的电子邮件链接多个帐户?

1 个答案:

答案 0 :(得分:3)

要关联帐户,应该有一个现有的会话。例如,假设新用户使用Google作为身份验证提供商创建帐户。

总之,要做到这一点,您需要:

  • 使用GIDSignIn通过Google对用户进行身份验证。
  • 然后Google返回一个Id令牌(如果一切顺利)。
  • 您将使用该令牌创建GoogleAuthProvider凭据对象。
  • 然后您使用此凭据在Firebase中调用signInWithCredential进行身份验证。

此过程与Facebook等其他身份验证提供商类似。要将帐户与Facebook相关联,您需要执行上面提到的前三个步骤(与Facebook auth相关),而不是&#34; signInWithCredential&#34;你需要打电话给#34; linkWithCredential&#34;。如果一切顺利,现在用户将能够使用Google或Facebook对同一帐户进行身份验证。

如果您致电&#34; signInWithCredential&#34;,您将创建一个使用Facebook作为身份验证提供商的新帐户。因此,用户将无法访问具有两个(或更多)身份验证提供程序的单个帐户,该用户将为每个身份验证提供程序提供两个单独的帐户。这就是documentation表示您应该跳过调用FirebaseAuth.signInWith方法的原因。

关于合并的问题,文档提到:&#34;如果凭据已经链接到另一个用户帐户&#34;,对linkWithCredential的调用将失败。这意味着用户已经拥有auth提供商的帐户。如果您希望用户从两个帐户访问信息,您将需要创建逻辑以将来自一个帐户的信息合并到另一个帐户。