如果在 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应用程序两次吗?

Expo + Firebase 身份验证(注册)安全问题

可以在firebase中的ios和android项目之间共享用户进行身份验证

Firebase 注册令牌未显示在 Android Studio logcat 中

Firebase Android - 跳过初始化

在同一张地图上显示多个注册用户的位置(Android Studio、Firebase、Kotlin)