如何确定Firebase用户是否使用Facebook身份验证登录

28

我正在使用来自谷歌的Firebase,并且在用户身份验证方面遇到了一些问题。在使用Facebook登录后,我在AuthStateListener中获得FirebaseUser,但是如何检测此用户是通过Facebook登录还是其他方式登录?

更新: 正如@Frank van Puffelen所说,FirebaseAuth.getInstance().getCurrentUser().getProviderId()应该返回“facebook”,但在我的情况下,它返回“firebase”。现在我无法弄清楚这种行为背后的原因。当我获得FacebookToken时,我会做类似于以下操作:

        AuthCredential credential = FacebookAuthProvider.getCredential(facebookToken.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {

                        }

                    }
                });

在 onComplete() 方法被调用之前,我的 AuthStateListener 获取的用户提供者 ID 不应该是 "facebook"。我做错了什么吗?我遵循了官方 Google 文档


1
我相信FirebaseUser.getProviderId()会返回"facebook.com",但是由于我的应用程序没有使用Facebook,所以我无法测试它。如果可以的话,也许可以尝试一下? - Craig C.
请看一下我的更新后的问题。 - Taldakus
6个回答

55

从3.x版本开始,单个用户可以使用多个提供者进行登录,因此不再存在单个提供者ID的概念。实际上,当您调用以下代码时:

FirebaseAuth.getInstance().getCurrentUser().getProviderId()

它将始终返回firebase

要检测用户是否使用Facebook登录,您需要检查提供程序数据:

for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {
  if (user.getProviderId().equals("facebook.com")) {
    System.out.println("User is signed in with Facebook");
  }
}

1
不幸的是,在我的情况下,getProviderId() 返回“firebase”。我会更新我的问题,如果您能看一下就太好了。 - Taldakus
2
你的更新代码确切地执行了我回答中前半部分所解释的内容。你使用了我第二个片段中的循环吗?在合并后的用户中,第一个 UserInfo 的提供者 ID 确实是 firebase。但是在我的测试中,第二个 UserInfo 的提供者 ID 是 google.com(我使用了 Google 提供者)。 - Frank van Puffelen
当然你是对的!我犯了一个小错误...非常感谢! - Taldakus
1
@FrankvanPuffelen 用户如何使用多个提供者进行登录,Firebase 如何知道当我的 Google 和 Facebook 帐户都登录到特定的 Firebase 后端时,它们是同一个用户? - Erik
@FrankvanPuffelen 这个其他提供者 ID 的文档在哪里可以参考呢?我找不到。 - kbpontius
1
根据我所了解的情况:Facebook -“facebook.com”,电子邮件 - “password”,Github -“github.com”,Google -“google.com”,电话 -“phone”,PlayGames -“playgames.google.com”,Twitter -“twitter.com”。匿名登录似乎会返回“Firebase”,但我无法找到确认此事的任何文件。 - rednuht

5

针对 2020 年 (Swift 5.0) 版本为 6.x.x 的 FirebaseAuth,以下是相关内容:

我使用 Auth.auth().currentUser?.providerData.first?.providerID

如果通过电子邮件登录,则返回password。如果通过 Facebook 登录,则返回facebook.com


5
在我的应用程序中,我使用匿名的Firebase账户。当我将Firebase身份验证与Facebook或Google账户连接时,我会像以下方式进行检查:
for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {

  if (user.getProviderId().equals("facebook.com")) { 
    //For linked facebook account
    Log.d("xx_xx_provider_info", "User is signed in with Facebook");

  } else if (user.getProviderId().equals("google.com")) { 
    //For linked Google account
    Log.d("xx_xx_provider_info", "User is signed in with Google");
  }

}

5

对我来说,以下解决方案是可行的。 首先,如果您还没有获取Firebase用户对象,请获取:

FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser firebaseUser = mAuth.getCurrentUser();

现在,在FirebaseUser对象上使用以下内容以获取登录提供程序:
firebaseUser.getIdToken(false).getResult().getSignInProvider()

参考资料:

https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser

https://firebase.google.com/docs/reference/android/com/google/firebase/auth/GetTokenResult.html

对于电子邮件,谷歌、Facebook 和 Twitter,它将返回密码、google.com、facebook.com 和 twitter.com。


1

响应的Intent中包含信息。请参考以下代码片段:


responseCode可能是“phone”、“google.com”、“facebook.com”或“twitter.com”之一。
    `import com.firebase.ui.auth.AuthUI;
    import com.firebase.ui.auth.IdpResponse;
    .....
    @Override
    protected void onActivityResult(final int requestCode, int resultCode, Intent 
    data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        if (requestCode == RC_SIGN_IN) {
 
            progressBar.setVisibility(View.VISIBLE);
 
            IdpResponse response = IdpResponse.fromResultIntent(data);
 
            if (resultCode == RESULT_OK) { 
                String providerCode = response.getProviderType();
                ... 
            }  
      }

0

最近的解决方案是:

此处所述

var uiConfig = {
        callbacks: {
          signInSuccessWithAuthResult: function(authResult, redirectUrl) {
            var providerId = authResult.additionalUserInfo.providerId;
            //...
          },
          //..
       }

并用于页面显示

firebase.auth().onAuthStateChanged(function (user) {
      if (user) {
        user.getIdToken().then(function (idToken) {

          $('#user').text(welcomeName + "(" + localStorage.getItem("firebaseProviderId")+ ")");
          $('#logged-in').show();
        }
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接