如何获得与Unity一起使用的Firebase身份验证链接帐户?

时间:2020-06-15 14:58:00

标签: firebase unity3d firebase-authentication

我想为多个身份验证提供者提供电话,facebook以及简单的电子邮件和密码。

问题是,如果该帐户与相同的电子邮件地址链接,我希望提供相同的帐户(相同的用户ID,相同的显示名称)。

正如我通过文档了解的那样,如果用户已经连接并关联了另一个提供商的帐户,则可以执行此操作。

所以我的问题是:无论如何,是否可以自动执行此操作,也就是说,用户下次与另一个提供程序连接时,不必告诉他自己链接它。

1 个答案:

答案 0 :(得分:0)

[编辑-经过进一步调查,我找到了一个更好的答案]

事实证明,只允许一次发送电子邮件地址会附带一些警告-在this GitHub issue中确实有明确规定,但我会尝试总结一下。

您可以拥有未验证的帐户,这可能使您可以在该帐户上注册(用户尚未证明自己拥有该帐户)。

接下来是一种社会身份提供者。例如,假设Facebook已验证过您的电子邮件一次,因此您可能会收到重复的帐户例外。

最后,有电子邮件身份提供者-这些身份提供者被视为对与其关联的所有电子邮件地址的权威,并且将覆盖与他们所负责的域具有相同地址的任何帐户。例如,Google和Apple登录都可以控制各自的域。

请参见此section of the web documentationthisthis堆栈溢出答案。

在这一点上,您可能想知道如果这不是您想要的用户流,如何获得对该流程的更多控制。

您可以在允许用户登录之前选择致电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控制台中“身份验证提供程序”页面底部的本节:

One account per email option in the Firebase console

因此,当您注册新用户时,您应该得到一个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
                }
            }
        }
    }
});

让我知道是否有帮助!

-帕特里克