我一直在我的应用中使用Firebase身份验证,并注意到特定用例的问题。
我为我的应用启用了启用帐户关联注册流程,因此我可以附加与单个电子邮件地址关联的多个提供商。
场景1:(工作正常)
用户最初与Google注册,稍后用Facebook登录或使用电子邮件和密码注册。
帐户关联工作正常,Facebook和/或电子邮件会添加到提供商列表中。
因此,我可以为电子邮件提供2或3个提供商,谷歌(最初),Facebook和密码(之后)。
场景2:(错误)
用户最初注册了Facebook和/或电子邮件,稍后又通过Google登录,现在帐户关联无效。 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);
});
希望有人能提出一些帮助。
答案 0 :(得分:2)
Facebook是一个社交身份提供商,它不拥有这些电子邮件。如果电子邮件被黑客入侵,Facebook无法检测到该电子邮件并禁用此电子邮件注册的帐户。虽然Google是电子邮件提供商,但其帐户被认为更安全。
基于此理论,方案2与1不同。在方案1中,用户首先通过Google与用户签名证明了此电子邮件的所有权。因此,允许用户使用相同的电子邮件添加Facebook帐户。在方案2中,Facebook登录首先发生,此提供商记录是不可信的,因此当用户使用其他可信提供商登录时,它将被删除。
在两种情况下,您的代码行为都是正确的。
答案 1 :(得分:0)
我遇到了同样的问题,这是评论中该问题的补充答案,即
Why is that after initially registering with a email & password, and then with Google, Google still replaces it?
我做了进一步的探索,找到了答案here。
粘贴相关代码段。
如果存在一个具有相同电子邮件地址但使用不可信凭证(例如,不可信提供商或密码)创建的帐户,则出于安全原因,将删除先前的凭证。网络钓鱼者(不是电子邮件地址所有者)可能会创建初始帐户-删除初始凭据将阻止网络钓鱼者随后访问该帐户。
要解决此问题,即阻止Google用Google替换现有提供商,解决方案是验证用户的电子邮件。
因此,在用户使用电子邮件和密码创建帐户或使用Facebook(或任何其他提供商)登录后,请向用户发送电子邮件验证链接。
用户验证了他/她的电子邮件之后,随后的Sign-in with Google
将不会替换现有的提供者。
答案 2 :(得分:-1)
暂时只使用电子邮件和密码验证,或者到目前为止第三方插件没有解决方案