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

时间:2016-07-27 17:30:15

标签: android firebase firebase-authentication

我正在使用谷歌的firebase,我在用户身份验证方面遇到了一些麻烦。使用Facebook登录后,我在AuthStateListener中获取FirebaseUser,但是如何通过facebook或不同方式检测此用户是否已记录?

UPDATE 正如@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不是&#34; facebook&#34;应该如此。难道我做错了什么?我关注了官方谷歌documentation

6 个答案:

答案 0 :(得分:43)

在版本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 :(得分:3)

在我的应用中,我使用的是匿名Firebase帐户。当我将Firebase auth与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");
  }

}

答案 2 :(得分:2)

针对2020年的FirebaseAuth目标版本6.x.x(Swift 5.0)的共享:

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

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

答案 3 :(得分: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();
                ... 
            }  
      }

答案 4 :(得分:1)

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

category

现在在FirebaseUser对象上使用以下命令获取登录提供程序:

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

来源:

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。

答案 5 :(得分:0)

最近的解决方案是:

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();
        }
    }
});
相关问题