我正在使用谷歌的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
答案 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();
}
}
});