如果在 Firebase Android 初始注册期间帐户已与 google 关联,则使用 Facebook 登录
Posted
技术标签:
【中文标题】如果在 Firebase Android 初始注册期间帐户已与 google 关联,则使用 Facebook 登录【英文标题】:Sign in with Facebook if account already linked with google during initial signup in Firebase Android 【发布时间】:2017-10-06 02:16:25 【问题描述】:我正在尝试在重新安装 android 应用程序时使用 facebook 登录。最初我使用 Google 注册并成功将其与 firebase 关联。
但是当我尝试使用 facebook 时,它给出了一个
FirebaseAuthUserCollisionException
我在Firebase Documentation 中看到您可以这样做
FirebaseUser prevUser = currentUser;
currentUser = auth.signInWithCredential(credential).await().getUser();
// Merge prevUser and currentUser accounts and data
// ...
但是这里await()
方法不再存在。同样经过一番搜索,我发现了这个解决方案
Tasks.await(mAuth.signInWithCredential(credential)).getUser();
但这在获取已链接的当前用户时也会出错。我该怎么做才能解决这个问题?
【问题讨论】:
我不确定,所以我不会将此作为答案发布,但我知道在 Firebase 控制台中,在 Authentication>Sign-In Method 下,底部显示 Advanced,有一个地方可以配置允许多个帐户到同一个地址。由于您链接的文档说您必须首先使用身份验证流程登录,因此您必须能够使用同一电子邮件创建多个帐户,然后才能合并它们。 support.google.com/firebase/answer/6400716?hl=en 仁人是对的 我如何合并帐户@faruk 【参考方案1】:.await()
方法不需要获取 firebase 用户。
请改用FirebaseAuth.AuthStateListener
。
因此,您可以使用以下方式实现 firebase 登录:
FirebaseAuth.getInstance()signInWithCredential(credential)
.addOnCompleteListener(new OnCompleteListener<AuthResult>()
@Override
public void onComplete(@NonNull Task<AuthResult> task)
if (task.isSuccessful())
Log.d(TAG, "login success");
else
Log.d(TAG, "login error");
);
并实现AuthStateListener
,它会在每次用户状态改变时触发:
private FirebaseAuth.AuthStateListener authStateListener;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
initAuthStateListener();
private void initAuthStateListener()
authStateListener = new FirebaseAuth.AuthStateListener()
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth)
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user == null)
//user is not logged in
else
//user is logged in
//logic to finish the activity and proceed to the app can be put here
;
@Override
protected void onStart()
super.onStart();
FirebaseAuth.getInstance().addAuthStateListener(authStateListener);
@Override
protected void onStop()
super.onStop();
FirebaseAuth.getInstance().removeAuthStateListener(authStateListener);
注意:onAuthStateChanged
会在 authStateListener
添加到 firebase 身份验证实例时触发一次。
还要确保在 Firebase 控制台上设置了 Prevent creation of multiple accounts with the same email address
参数(身份验证 >> 登录方法 >> 高级 >> 每个电子邮件地址一个帐户(更改))。
【讨论】:
当用户已经使用 google plus id 注册过一次时,这将无济于事。它会给出 FirebaseAuthUserCollisionException。然后我们需要合并文档中说要使用 awaits() 的两个帐户。但我无法成功使用它 当您使用 google 登录,然后使用同一电子邮件使用 facebook 登录时,firebase 默认将这些帐户链接到一个(还要检查我的答案底部提到的设置是否在 firebase 中设置您项目的控制台) 默认情况下不会发生链接 默认情况下会使用相同的电子邮件链接帐户。 Firebase 控制台项目中有一个选项“防止使用相同的电子邮件地址创建多个帐户”,默认情况下处于启用状态。 @dzikovskyy,我默认设置了“防止使用相同的电子邮件地址创建多个帐户”,我遇到了与 Shubham 相同的问题。意思是电子邮件/帐户已在使用中,我应该使用正确的提供商登录。因此,它不会自动链接它。我可以打电话给getCurrentUser().linkWithCredential(credential)
,但问题是我退出后 getCurrentUser() 为空(这也是我再次看到登录活动的原因)。有什么解决办法吗?以上是关于如果在 Firebase Android 初始注册期间帐户已与 google 关联,则使用 Facebook 登录的主要内容,如果未能解决你的问题,请参考以下文章
如果我只使用flutter web(没有android或ios应用程序),我还应该在index.html和main.dart中初始化firebase应用程序两次吗?
可以在firebase中的ios和android项目之间共享用户进行身份验证