android – 使用Google问题进行Firebase身份验证

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

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

场景1 :(工作正常)

用户最初与Google签约,稍后用Facebook登录或通过电子邮件和密码注册.

帐户链接工作正常,Facebook和/或电子邮件添加到提供者列表中.

因此,我可以为电子邮件提供2或3个提供商,谷歌(最初),Facebook和密码(之后).

场景2 :(错误)

用户最初使用Facebook和/或电子邮件注册,稍后使用Google登录,现在帐户链接无效. Google取代之前的提供商.

帐户关联失败,我只是将谷歌作为与电子邮件地址关联的唯一提供商,其他人已经不在了.

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

我不能在这里粘贴整个代码,但只是一个片段肯定.

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);

                        });

希望有人能提出一些帮助.

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

基于此理论,方案2与1不同.在方案1中,用户首先通过Google与用户签名证明了此电子邮件的所有权.因此,允许用户使用相同的电子邮件添加Facebook帐户.在方案2中,Facebook登录首先发生,此提供商记录是不可信的,因此当用户使用另一个可信提供商登录时,它将被删除.

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

点赞