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)
在我的应用中,我使用匿名 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)
对我来说,以下解决方案有效。首先,如果您还没有,请获取 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。
FirebaseAuth2020 年目标版本(Swift 5.0)共享6.x.x:
我用Auth.auth().currentUser?.providerData.first?.providerID。
如果通过电子邮件登录,这将返回密码。如果通过 Facebook,则为facebook.com 。
| 归档时间: |
|
| 查看次数: |
13219 次 |
| 最近记录: |