【问题标题】:Firebase Authentication with Google issueFirebase 身份验证与 Google 问题
【发布时间】:2016-10-16 18:17:24
【问题描述】:

我一直在我的应用中使用 Firebase 身份验证,并注意到特定用例存在问题。

我为我的应用启用了帐户链接注册流程,因此我可以附加与单个电子邮件地址关联的多个提供商。

场景 1:(工作正常)

用户最初是在 Google 上注册的,之后的某个时间,用 Facebook 登录或使用电子邮件和密码注册。

帐户链接工作正常,并且 Facebook 和/或电子邮件已添加到提供商列表中。

所以,我可以为电子邮件、Google(最初)、Facebook 和 Password(之后)提供 2 或 3 个提供商。

场景 2:(错误)

用户最初使用 Facebook 和/或电子邮件注册,后来使用 Google 登录,现在帐户链接不起作用。 Google 取代了以前的供应商。

帐户关联失败,我只是让 Google 作为与电子邮件地址关联的唯一提供商,而其他人都不见了。

在第二种情况下,在使用 Google 登录时,它应该会失败并抛出 FirebaseAuthCollisionException,但它不会并成功。 这是主要问题。

我不能在这里粘贴整个代码,但肯定只是一个 sn-p。

firebaseAuth
                        .signInWithCredential(credential)
                        .addOnFailureListener(exception -> {
                            if (exception instanceof FirebaseAuthUserCollisionException) {
                                mCredentialToLinkWith = credential;
                                if (mProviderList.size() == 1) {
                                    if (mProviderList.contains(EmailAuthProvider.PROVIDER_ID)) {
                                        mRegisterProviderPresenter.linkWithEmailProvider(credential, email);
                                    } else {
                                        linkProviderAccounts(email, AuthenticationHelper.getProviderToLinkAccounts(mWeakActivity, mProviderList));
                                    }
                                } else {
                                    linkProviderAccounts(email, AuthenticationHelper.getProviderToLinkAccounts(mWeakActivity, mProviderList));
                                }
                            } else {
                                Timber.d("Failed in signInWithCredential and unexpected exception %s", exception.getLocalizedMessage());
                                mRegisterProviderPresenter.onRegistrationFailed(new ErrorBundle(ErrorBundle.FIREBASE_ERROR, exception.getLocalizedMessage()));
                            }
                        })
                        .addOnSuccessListener(authResult -> {
                            Timber.d("Success: signInCred");
                            FirebaseUser firebaseUser = authResult.getUser();
                            /**
                             * Store the user details only for first time registration
                             * and not while acc linking
                             */
                            storeUserCredentials(firebaseUser);
                            AuthenticationHelper.logUserDetails(firebaseUser);
                            mRegisterProviderPresenter.onRegistrationSuccess(mAlreadyRegistered);

                        });

希望有人能提供一些帮助。

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    Facebook 是一个社交身份提供商,它不拥有电子邮件。如果电子邮件被黑客入侵,Facebook 无法检测到它并禁用此电子邮件注册的帐户。虽然 Google 是一家电子邮件提供商,但其帐户被认为更安全。

    基于此理论,场景 2 与 1 不同。在场景 1 中,用户通过先与 Google 签署证明了这封电子邮件的所有权。因此,允许用户使用同一电子邮件添加 Facebook 帐户。在场景 2 中,首先发生 Facebook 登录,并且此提供商记录不受信任,因此当用户使用另一个受信任的提供商登录时,它会被删除。

    您的代码行为在这两种情况下都是正确的。

    【讨论】:

    • 感谢您的出色解释。那么,为什么在最初使用电子邮件和密码注册后,然后使用谷歌,谷歌仍然会替换它?
    【解决方案2】:

    我遇到了同样的问题,这是评论中问题的补充答案,即

    Why is that after initially registering with a email & password, and then with Google, Google still replaces it?

    我又做了一些探索,找到了答案here

    粘贴相关的sn-p。

    如果存在具有相同电子邮件地址但使用不受信任的凭据(例如不受信任的提供商或密码)创建的现有帐户,则出于安全原因会删除以前的凭据。网络钓鱼者(不是电子邮件地址所有者)可能会创建初始帐户 - 删除初始凭据会阻止网络钓鱼者之后访问该帐户。

    解决此问题的解决方案(即防止 Google 用 Google 替换现有提供商)是验证用户的电子邮件。

    因此,在用户使用电子邮件和密码创建帐户或使用 Facebook(或任何其他提供商)登录后,向用户发送电子邮件验证链接。

    用户验证邮箱后,后续的Sign-in with Google将不会取代现有的provider。

    【讨论】:

      【解决方案3】:

      暂时只使用电子邮件和密码验证或第三方插件目前没有解决方案

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 2022-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2017-03-16
        相关资源
        最近更新 更多