如何确定 Firebase 用户是不是使用 facebook 身份验证登录

Posted

技术标签:

【中文标题】如何确定 Firebase 用户是不是使用 facebook 身份验证登录【英文标题】:How to determine if a Firebase user is signed in using facebook authentication如何确定 Firebase 用户是否使用 facebook 身份验证登录 【发布时间】:2021-12-26 05:29:57 【问题描述】:

我正在使用来自 google 的 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”的用户。难道我做错了什么?我关注了官方googledocumentation

【问题讨论】:

我相信 FirebaseUser.getProviderId() 将返回“facebook.com”,但我无法测试它,因为我的应用程序不使用 facebook。如果可以的话,不妨试试看? 请看我更新的问题。 【参考方案1】:

在 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");
  

【讨论】:

不幸的是 getProviderId() 在我的情况下返回“firebase”。我会更新我的问题,如果你能看一下就好了。 更新中的代码正是我的答案前半部分所解释的。您是否使用了我在第二个 sn-p 中的循环?第一个 UserInfo 确实将具有提供者 ID firebase(因为它适用于合并用户)。但我测试中的第二个有google.com(我使用了谷歌提供者)。 你当然是对的!我犯了一个简单的错误......非常感谢。 @FrankvanPuffelen 用户如何登录多个提供商,FireBase 如何知道我的 google 和我的 facebook 当它们都被写入特定的 FireBase 后端时,是同一个用户? @kbpontius - 从我能收集到的信息:facebook - “facebook.com”,电子邮件 - “密码”,github - “github.com”,google - “google.com”,电话 - “电话”,游戏 - “playgames.google.com”,推特 - “twitter.com”。匿名登录似乎返回“firebase”,但我找不到任何文件证实这一点。【参考方案2】:

在我的应用中,我使用匿名 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");
  


【讨论】:

【参考方案3】:

对我来说,以下解决方案有效。 首先,如果您还没有获取 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

它将分别返回电子邮件、google、facebook 和 twitter 的密码、google.com、facebook.com 和 twitter.com。

【讨论】:

【参考方案4】:

分享FirebaseAuth 目标版本6.x.x (Swift 5.0),2020 年:

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

如果通过电子邮件登录,这将返回 密码。如果通过 Facebook,还有 facebook.com

【讨论】:

【参考方案5】:

响应的 Intent 中存在信息。 参考以下sn-p: responseCode 是“phone”、“google.com”、“facebook.com”或“twitter.com”。

`导入com.firebase.ui.auth.AuthUI; 导入 com.firebase.ui.auth.IdpResponse; ...... @覆盖 protected void onActivityResult(final int requestCode, int resultCode, Intent 数据) super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) progressBar.setVisibility(View.VISIBLE); IdpResponse 响应 = IdpResponse.fromResultIntent(data); if (resultCode == RESULT_OK) String providerCode = response.getProviderType(); ...

【讨论】:

【参考方案6】:

最近的解决方案是:

如上所述here

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

【讨论】:

以上是关于如何确定 Firebase 用户是不是使用 facebook 身份验证登录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Auth 中检查用户是不是通过 Facebook 登录 [重复]

如何使用geofire查询检查10公里半径内是不是存在firebase用户

如何检查用户是不是在客户端使用 Firebase 登录? [关闭]

如何确定 JEST 是不是正在运行代码?

如何检查用户是不是刚刚在 Firebase 中首次登录 Google

如何检测用户是不是第一次在 Firebase [重复]