我想为多个身份验证提供者提供电话,facebook以及简单的电子邮件和密码。
问题是,如果该帐户与相同的电子邮件地址链接,我希望提供相同的帐户(相同的用户ID,相同的显示名称)。
正如我通过文档了解的那样,如果用户已经连接并关联了另一个提供商的帐户,则可以执行此操作。
所以我的问题是:无论如何,是否可以自动执行此操作,也就是说,用户下次与另一个提供程序连接时,不必告诉他自己链接它。
答案 0 :(得分:0)
事实证明,只允许一次发送电子邮件地址会附带一些警告-在this GitHub issue中确实有明确规定,但我会尝试总结一下。
您可以拥有未验证的帐户,这可能使您可以在该帐户上注册(用户尚未证明自己拥有该帐户)。
接下来是一种社会身份提供者。例如,假设Facebook已验证过您的电子邮件一次,因此您可能会收到重复的帐户例外。
最后,有电子邮件身份提供者-这些身份提供者被视为对与其关联的所有电子邮件地址的权威,并且将覆盖与他们所负责的域具有相同地址的任何帐户。例如,Google和Apple登录都可以控制各自的域。
请参见此section of the web documentation和this和this堆栈溢出答案。
在这一点上,您可能想知道如果这不是您想要的用户流,如何获得对该流程的更多控制。
您可以在允许用户登录之前选择致电FirebaseAuth.DefaultInstance.FetchProvidersForEmailAsync。然后,您可以选择提示他们先使用其现有帐户重新登录,以链接帐户,然后再创建新帐户(和可能会替换旧帐户)。例如:
public async void LogIn(string email, Credential credential) {
var auth = FirebaseAuth.DefaultInstance;
var identityProviders = await auth.FetchProvidersForEmail(email);
if (identityProviders.Empty()) {
var user = auth.SignInWithCredentialAsync(credential);
}
else {
// somewhere in here, log in the user and call
// user.LinkWithCredentialAsync(credential)
DisplayLinkAccountDialog(identityProviders, email, credential);
}
}
默认情况下,Firebase身份验证每个用户只允许一个电子邮件地址。请参阅Firebase控制台中“身份验证提供程序”页面底部的本节:
因此,当您注册新用户时,您应该得到一个FirebaseException,错误代码为AccountExistsWithDifferentCredentials。
要处理此问题,您需要使延续看起来像这样:
/* Registration call */.ContinueWithOnMainThread(task=>{
if (task.Exception) {
foreach (var e in task.Exception.InnerExceptions) {
var fe = e as FirebaseException;
if (fe != null) {
if (fe.ErrorCode == AuthError.AccountExistsWithDifferentCredentials) {
TryToLinkInsteadOfCreateAccount(); // TODO - cache credentials and implement this
}
}
}
}
});
让我知道是否有帮助!
-帕特里克