首页 文章

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

提问于
浏览
19

我正在使用谷歌的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" . 难道我做错了什么?我跟着官方谷歌documentation

4 回答

  • 42

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

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

    响应的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();
                    ... 
                }  
          }
    
  • 1

    最近的解决方案是:

    如上所述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();
            }
        }
    });
    

相关问题