【问题标题】:Android Firebase linking multiple account providers with matching emailAndroid Firebase 将多个帐户提供商与匹配的电子邮件相关联
【发布时间】:2017-10-22 20:41:21
【问题描述】:

在我的 firebase 仪表板中,我设置了 multiple accounts for one email 选项。

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

我在我的 LoginActivity 中像这样处理它们中的每一个:

谷歌加:

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

                    }

                    // ...
                }
            });
}

脸书:

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)

现在很混乱。 由于我跳过了 signInWith 方法,当它仍然为 null 时如何调用 getCurrentUser?

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

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

另外,signInWithCredenial 没有await 方法。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    该过程与 Facebook 等其他身份验证提供商类似。为了将帐户与 Facebook 关联,您需要执行上述前三个步骤(与 Facebook auth 相关),但您需要调用“linkWithCredential”而不是“signInWithCredential”。如果一切顺利,现在用户将能够通过 Google 或 Facebook 对同一帐户进行身份验证。

    如果您调用“signInWithCredential”,您将创建一个使用 Facebook 作为身份验证提供者的新帐户。因此,用户不能访问具有两个(或更多)身份验证提供者的单个帐户,而是该用户将为每个身份验证提供者拥有两个单独的帐户。这就是documentation 说您应该跳过调用 FirebaseAuth.signInWith 方法的原因。

    关于您关于合并的问题,文档提到:“如果凭据已链接到另一个用户帐户,则对 linkWithCredential 的调用将失败”。这意味着用户已经拥有身份验证提供程序的帐户。如果您希望用户访问来自两个帐户的信息,您将需要创建将信息从一个帐户合并到另一个帐户的逻辑。

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 2010-10-02
      • 2019-12-24
      • 2022-06-11
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多