如何处理 FirebaseAuthUserCollisionException

2023-11-24

我开始得到FirebaseAuthUserCollisionException当我尝试登录时出现异常Facebook in my Android应用。

com.google.firebase.auth.FirebaseAuthUserCollisionException:一个 已存在具有相同电子邮件地址但不同的帐户 登录凭据。使用与此关联的提供商登录 电子邮件地址。

我在用Firebase处理注册,Facebook 提供“一键式”登录方法,使用com.facebook.login.widget.LoginButton视图作为触发器。

这些登录方法已经可以使用了。我能够在 Facebook 上注册一个帐户,并使用相同的方法登录该帐户。但现在已经开始抛出这个异常了。

以下是我从 Facebook 注册帐户并继续登录的代码:

private void handleFacebookAccessToken(AccessToken token) {
    final ProgressDialog dialog = new ProgressDialog(this);
    dialog.show(getString(R.string.dialog_wait));
    firebaseAuth.signInWithCredential(FacebookAuthProvider.getCredential(token.getToken()))
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        dialog.close();
                        registerNewUserFromSocialLogin(firebaseAuth.getCurrentUser());
                    } else {
                        if(task.getException() instanceof FirebaseAuthUserCollisionException) {

                            //TODO: handle sign-in with different credentials

                        } else {
                            dialog.close();
                            LoginManager.getInstance().logOut();
                            Toast.makeText(LoginActivity.this,
                                    R.string.error_login,
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
}

And my Gradle当前使用库的文件:

compile 'com.google.firebase:firebase-auth:10.2.1'
compile 'com.facebook.android:facebook-android-sdk:[4,5)'

所以我的问题是:我不知道如何处理FirebaseAuthUserCollisionException例外。

StackOverflow 或 Firebase 文档中的解决方案都没有帮助我。我正在寻找一种解决方案,能够通过重复的凭据登录用户,但仍提供“一键式”登录方法。


当用户之前使用不同提供商使用同一电子邮件登录时,您将收到该错误。例如,用户使用电子邮件登录[电子邮件受保护]使用谷歌。然后,用户尝试使用同一电子邮件地址但使用 Facebook 登录。 Firebase Auth 后端将返回该错误(帐户存在不同的凭据)。在这种情况下,您应该使用fetchProvidersForEmail查找与电子邮件关联的现有提供商[电子邮件受保护], 在这种情况下google.com. You signInWithCredential到现有的谷歌帐户以证明该帐户的所有权,然后linkWithCredential用户最初尝试登录的 Facebook 凭据。这会合并两个帐户,以便将来用户可以使用其中一个帐户登录。

当您使用single accounts per email。如果您想允许每个电子邮件使用不同的帐户,您可以切换到multiple accounts per email在 Firebase 控制台中。

这是一个例子:

mAuth.signInWithCredential(authCredential)
    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            // Account exists with different credential. Assume the developer wants to
            // continue and link new credential to existing account.
            if (!task.isSuccessful() &&
                task.getException() instanceof FirebaseAuthUserCollisionException) {
                FirebaseAuthUserCollisionException exception =
                        (FirebaseAuthUserCollisionException)task.getException();
                if (exception.getErrorCode() == 
                    ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL) {
                    // Lookup existing account’s provider ID.
                    mAuth.fetchProvidersForEmail(existingAcctEmail)
                       .addOnCompleteListener(new OnCompleteListener<ProviderQueryResult> {
                          @Override
                          public void onComplete(@NonNull Task<ProviderQueryResult> task) {
                            if (task.isSuccessful()) {
                              if (task.getResult().getProviders().contains(
                                      EmailAuthProvider.PROVIDER_ID)) {
                                // Password account already exists with the same email.
                                // Ask user to provide password associated with that account.
                                ... 
                                // Sign in with email and the provided password.
                                // If this was a Google account, call signInWithCredential instead.
                                mAuth.signInWithEmailAndPassword(existingAcctEmail, password)
                                  addOnCompleteListener(new OnCompleteListener<AuthResult> {
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                      if (task.isSuccessful()) { 
                                        // Link initial credential to existing account.
                                        mAuth.getCurrentUser().linkWithCredential(authCredential);
                                      }
                                    }
                                  });
                              }
                            }
                          }
                        });
            }
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 FirebaseAuthUserCollisionException 的相关文章

随机推荐

  • SetNeedsDisplay 不起作用

    我看到了许多与此问题相关的线程 但没有一个解决我的情况 我认为 我的情况应该很简单 我有一个自定义UIView在我的控制器中 从我的控制器中 我使用 self myView setNeedsDisplay 并且效果完美 当我尝试从内部调用它
  • django-cms + grappelli

    如果有人知道如何让 django cms 玩 grappelli 请给一些提示 嗯 我刚刚经历了一次相当史诗般的冒险 其中的故事可能对你有用 上述冒险的终点是让 django cms 2 1 3 与django 文件浏览器无 grappel
  • 将 HTML 插入 golang 模板 [重复]

    这个问题在这里已经有答案了 我在 golang 中有一个模板 其中有一个看起来像这样的字符串
  • 我应该在 InnoDB 中避免一起使用 COUNT 吗?

    我现在正在纠结要不要用COUNT id 或 计数 列 听说InnoDBCOUNT没有的话非常慢WHERE子句 因为它需要锁定表并进行全索引扫描 使用时是否有相同的行为WHERE clause 例如 如果我有一个包含 100 万条记录的表 做
  • 实体框架,视图而不是插入触发器。无法在视图中插入行

    我无法将实体插入到映射视图中 我得到的错误是 存储 插入或删除语句影响了意外数量的行 0 我知道如何使用存储过程 但对我来说更有趣的是尝试在插入行视图事件上使用而不是触发器的解决方案 在 t sql 代码中删除 更新或插入时 我没有收到任何
  • 新的 Android 12+ MaterialSwitch 和 androidx.preference

    所以我正在更新我的应用程序以完全支持 Monet 和 Material You 指南 官方网站提到开关的新设计 我用了一下 结果是这样的 我有一个使用 Androidx 首选项库的首选项屏幕 在撰写本文时提供了最新版本 我发现对开关进行主题
  • 使用 Spring Security 记录登录

    我想记录我的网络应用程序中的每次登录 我能够访问通过以下方式进行的登录UsernamePasswordAuthenticationFilter但我不知道如何记录使用记住我功能登录的用户 我尝试覆盖 createSuccessfulAuthe
  • 如何用 jquery 中使用的另一个字符替换“美元”符号?

    如何将 jquery 中使用的美元符号 jquery 的别名 更改为另一个字符 例如 id css height 210px 我想将其更改为 id css height 210px 你无法改变 to 因为 不是有效的标识符 但你可以将其更改
  • 即使设置了权限也无法写入 Android 外部存储

    在我使用 Xamarin Forms 的 Android 10 0 Q 应用程序中 我已在清单中正确设置
  • 在 Linux 上如何通过名称而不是 PID 来终止进程? [复制]

    这个问题在这里已经有答案了 有时 当我尝试启动 Firefox 时 它会显示 Firefox 进程已在运行 所以我必须这样做 jeremy jeremy desktop ps aux grep firefox jeremy 7451 25
  • 如何在 Perl 中构建独立于操作系统的文件路径(包括可选的 Windows 驱动器号)?

    我需要在 Perl 脚本内构建一个文件路径 我应该使用哪个路径分隔符来允许我的脚本在 Windows 和 Unix 上运行 请记住 Windows 需要驱动器号 你要文件 规格 s catpath catpath Takes volume
  • 用 Javascript 编写组合和排列计算器的最有效方法

    我有一个数学网站http finitehelp com教学生有限数学 我认为包含一个计算器会很酷 所以我制作了一个用于 Javascript 中的组合和排列的计算器 实时计算器位于http finitehelp com finite cal
  • pySpark forEachPartition - 代码在哪里执行

    我正在使用 2 3 版本的 pySpark 在我当前的开发系统中无法更新到 2 4 并且有以下关于对于每个分区 首先是一些背景信息 据我了解 pySpark UDFs强制 Python 代码在 Python 实例中的 Java 虚拟机 JV
  • Rails 中带有 jquery params 的 link_to

    我想在我的 Rails 应用程序中进行就地搜索 我使用了带有原型的button to remote 但现在我使用的是JQuery 所以我更改为link to 这是我的代码 我想将地址文本字段传递到我的控制器 但输出不是我所期望的 mycon
  • DataGridView设置行高不起作用

    尝试像这样设置 RowHeight 在代码中 dgvTruckAvail RowTemplate Height 48 不起作用 我还尝试设置我添加的每一列的高度 不起作用 这是网格属性 this dgvTruckAvail AllowUse
  • d3.js 使用多列从 csv 文件中过滤

    我想使用 csv 中的多个列值进行过滤 我首先想按城市过滤 然后按关键性列过滤 我想过滤重要性 高 中 低 如何使用 AND OR 进行过滤 City 和 Criticality 是复选框 根据我想要过滤相应 csv 列中的数据的选择 寻找
  • 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?

    我想 P 调用获取窗口长指针 and 设置窗口长指针 并且我看到有关它们的相互矛盾的信息 有消息称 在 32 位平台上 GetWindowLongPtr 只是一个调用 GetWindowLong 的预处理器宏 并且 GetWindowLon
  • Java:如何设置 htmlunit

    我对 Java 是个菜鸟 但我想尝试一下 htmlunit 我使用 netbeans 作为 IDE 并创建了一个项目文件夹 hu1 以下是该文件夹的结构 hu1 gt nbproject gt src gt hu1 gt test 现在 我
  • 带有共享 ID 的 JPA @OneToOne —— 我可以做得更好吗?

    我正在使用一个我不想更改的现有架构 该架构在表 Person 和 VitalStats 之间具有一对一的关系 其中 Person 有一个主键 VitalStats 使用相同的字段作为 Person 的主键和外键 这意味着它的值是相应 PK
  • 如何处理 FirebaseAuthUserCollisionException

    我开始得到FirebaseAuthUserCollisionException当我尝试登录时出现异常Facebook in my Android应用 com google firebase auth FirebaseAuthUserColl