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

Tal*_*kus 21 android firebase firebase-authentication

我正在使用谷歌的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()) {

                        }

                    }
                });
Run Code Online (Sandbox Code Playgroud)

然后在调用onComplete()方法之前,我的AuthStateListener获取用户哪个提供者ID不应该是"facebook".难道我做错了什么?我按照官方谷歌文档

Fra*_*len 45

在3.x及更高版本中,单个用户可以使用多个提供程序登录.因此,不再存在单个提供者ID的概念.事实上,当你打电话:

FirebaseAuth.getInstance().getCurrentUser().getProviderId()
Run Code Online (Sandbox Code Playgroud)

它总会回来firebase.

要检测用户是否使用Facebook登录,您必须检查提供者数据:

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

  • 您的更新中的代码正是我的答案的前半部分所解释的.你在我的第二个代码片段中使用了我的循环吗?第一个`UserInfo`确实有提供者id`firebase`(就像合并用户一样).但我测试中的第二个是"google.com"(我使用的是Google提供商). (2认同)

Jay*_* PM 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");
  }

}
Run Code Online (Sandbox Code Playgroud)


Ume*_*res 5

对我来说,以下解决方案有效。首先,如果您还没有,请获取 firebase 用户对象:

FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser firebaseUser = mAuth.getCurrentUser();
Run Code Online (Sandbox Code Playgroud)

现在在 FirebaseUser 对象上使用以下内容来获取登录提供程序:

firebaseUser.getIdToken(false).getResult().getSignInProvider()
Run Code Online (Sandbox Code Playgroud)

资料来源:

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。


Gle*_*enn 5

FirebaseAuth2020 年目标版本(Swift 5.0)共享6.x.x

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

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