如何处理 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 的相关文章

  • 自定义 ListView 和 onclick

    这是我的代码 一切 我按照你说的做了 但我仍然无法点击任何内容 我的意思是我可以点击但没有任何反应 package fixus core import java util ArrayList import java util Iterato
  • 如何从cloud firestore获取数据,其中user.uid等于flutter中的文档id?

    我有一个显示用户信息的个人资料屏幕 用户经过身份验证后 我将数据存储在云 Firestore 中 文档 ID 等于用户 ID 现在 我想从 cloud firestore 检索数据 当前 userId 等于文档 id 现在我有这个 clas
  • 文件 API - Phonegap?

    谁能解释如何使用适用于 Android 的 Phonegap 文件 API 在页面上列出文件文件夹 我想列出所有 mp3如果可能的话 请阅读文件 但已阅读所有phonegap文档 http docs phonegap com en 1 0
  • 5.1 崩溃 - 任务描述的主要颜色应该是不透明的

    我已经在我的应用程序中实现了材料设计 它在 FATAL EXCEPTION main Process com test test PID 3195 java lang RuntimeException Unable to start act
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • Android 线程和处理程序不工作

    我最近重构了一个旧项目 发现无论我做什么 特定部分都不再需要正常运行 本质上 我有一个带有 TextView 的 Activity 该视图按时间间隔从同一类中调用的线程更新 暂停是通过 Thread sleep 完成的 并且使用 Handl
  • FirebaseAuth - 让用户使用任何提供商更改密码 - Android

    我有一个社交媒体应用程序 我正在使用FirebaseUI让用户使用电子邮件 Google 或 Facebook 登录 注册应用程序 如果使用 电子邮件 作为密码 我怎样才能让用户稍后更改他 她的密码 提供商 如果使用 Facebook 或
  • 使用 android-async-http (loopj) 发布 JSON/XML

    我在用android async http http loopj com android async http 并且真的很喜欢它 我在发布数据时遇到了问题 我必须按照以下格式将数据发布到 API
  • 从主线程查询android中的数据库

    我使用的是 sql lite 通常查询 1 个表 如果我从主 ui 线程进行查询会不会很糟糕 谢谢 这取决于 如果您的表确实很大 则执行查询可能需要一些时间 并且可能会导致您的应用程序出现明显的延迟 还有 你说你usually仅查询一张表
  • 如何解决Android中的NullPointerException错误?

    下面的代码在 Eclipse 的模拟器中运行顺利 但在 Android 手机和平板电脑上运行时出现问题 public class RingerActivity extends Activity Called when the activit
  • 如何将 Material 按钮与其他 UI 元素对齐

    我无法将默认材质按钮与 UI 的其他元素对齐 事实上 我已经查看了 Android 源代码 按钮的背景包含插图 以便能够绘制阴影并处理单击时按钮的高度
  • facebook fql 查询类似于朋友签到

    寻找与下面的搜索等效的 fql 希望获得朋友的所有签到和地点名称 EDIT temp time 2 周前 如果在下面 则获取签到的页面 ID 地点 和作者 ID 用户 SELECT author uid page id FROM check
  • 丢弃对 OpenGL 中的程序性能有影响吗?

    我正在读书this http code google com p gdc2011 android opengl wiki TalkTranscript文章 作者写道 以下是如何通过两个简单的步骤在每个平台上编写高性能应用程序 遵循最佳实践
  • 以编程方式更改小部件布局

    假设我有两个小部件布局 Layout1 和 Layout2 小部件的默认值是 Layout1 但我允许用户选择 他们希望小部件采用哪种布局 所以如果用户更改为 Layout2 如何以编程方式将布局更改为 Layout2 小部件没有像活动那样
  • 使用 Facebook API 在朋友的墙上发布帖子

    我希望我的 Facebook 应用程序能够获取使用该应用程序的用户的 ID 并在他们的一位朋友的墙上找到该 ID 发布的帖子 我更喜欢使用个人 ID 的示例 而不是迭代所有朋友 我认为两个用户很可能都必须向应用程序提供权限才能执行此操作 这
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • ConstraintLayout 源代码位于哪里?

    哪里可以找到android的源代码ConstraintLayout 我在支持框架存储库甚至谷歌搜索中都找不到它 它的源代码在这里 https android googlesource com platform frameworks opt
  • 如何使用游戏循环每五秒在屏幕上出现和消失一个对象

    我正在尝试学习 Android 游戏开发 首先 我尝试每五秒使用游戏循环在屏幕上出现和消失一个对象 但我没有成功 我读过不同的教程和论坛 我按照教程中的方式应用了所有内容 但对象仍然在连续绘制 它并没有消失 我没有得到我所缺少的东西 请指导
  • Firebase 附加权限。是否要求用户接受

    我目前正在致力于将 Firebase Analytics 集成到我的 Android 应用程序中 我遇到的问题是 Firebase 添加了一些新权限 这些权限是 permission WAKE LOCK com google android

随机推荐

  • 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