繁体   English   中英

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

[英]How to determine if a Firebase user is signed in using facebook authentication

我正在使用来自 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”,因为它应该是。 我做错了什么吗? 我按照官方谷歌文档

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

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

}

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

FirebaseAuth目标版本6.xx (Swift 5.0) 的共享,2020 年:

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

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

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

最近的解决方案是:

正如这里所指出的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM