You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity集成Firebase Auth时Facebook ProviderData的Email字段为空问题

解决Firebase ProviderData中Facebook邮箱为空的问题

我完全懂你碰到的这个困扰——之前在Unity里整合Firebase和Facebook登录时,我也踩过一模一样的坑。明明已经请求了email权限,用FB.API也能拿到邮箱,但Firebase用户的ProviderData里来自facebook.com的条目就是没有邮箱信息。

问题根源

Firebase在通过Facebook凭证验证用户身份时,默认只会从Facebook的token验证接口获取基础公开信息(比如用户名、头像、用户ID),并不会主动去拉取邮箱字段。哪怕你请求了email权限,Facebook也不会把邮箱数据自动附带在token的验证响应里——你得主动通过Graph API去获取,而Firebase不会帮你做这一步。

解决方案

既然你已经能通过FB.API("/me?fields=email")拿到邮箱,那我们只需要在Firebase登录成功后,手动把这个邮箱更新到Firebase用户的资料里即可。这样不仅能让user.Email字段有值,也能保证Firebase的用户数据完整性。

步骤1:存储获取到的Facebook邮箱

先在脚本里添加一个全局变量来存储从Facebook拿到的邮箱:

private string _facebookEmail; // 新增全局变量

然后修改DisplayUsername方法,把拿到的邮箱存起来:

void DisplayUsername(IResult result) {
    Text Username = DialogUsername.GetComponent<Text>();
    if (result.Error == null) {
        _facebookEmail = result.ResultDictionary["email"].ToString();
        Username.text = _facebookEmail;
    } else {
        Debug.Log(result.Error);
    }
}

步骤2:Firebase登录成功后更新邮箱

在FirebaseLogin方法的ContinueWith回调里,登录成功后添加更新邮箱的逻辑:

auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
    if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
    }
    if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
    }

    Firebase.Auth.FirebaseUser user = task.Result;
    Debug.LogFormat("User signed in successfully: {0} ({1})", user.DisplayName, user.UserId);

    // 新增:更新Firebase用户邮箱
    if (!string.IsNullOrEmpty(_facebookEmail) && 
        (string.IsNullOrEmpty(user.Email) || !user.Email.Equals(_facebookEmail))) {
        user.UpdateEmailAsync(_facebookEmail).ContinueWith(updateTask => {
            if (updateTask.IsCanceled) {
                Debug.LogError("UpdateEmailAsync was canceled.");
                return;
            }
            if (updateTask.IsFaulted) {
                Debug.LogError("UpdateEmailAsync encountered an error: " + updateTask.Exception);
                return;
            }
            Debug.Log("User email updated successfully!");
            // 更新UI显示邮箱
            emailText[0].text = _facebookEmail;
            // 注意:ProviderData里的Facebook条目还是不会有邮箱,因为这是Facebook返回的原始数据
            // 后续直接用user.Email即可,不用从ProviderData里取
        });
    }

    // 你的原有UI更新代码...
});

关键说明

  • ProviderData里的Facebook条目邮箱为空是正常的,因为这是Facebook返回给Firebase的原始身份数据,Firebase不会修改它。后续你直接使用user.Email就能获取到用户的邮箱,不用再从ProviderData里提取。
  • 确保你的Facebook应用后台已经正确配置了email权限,并且用户确实授权了(你代码里已经添加了权限请求,这部分没问题)。
  • 由于你设置了“每个邮箱对应一个账号”,如果用户之前已经用这个邮箱创建过Firebase账号,Firebase会自动合并账号,不会出现冲突。

内容的提问来源于stack exchange,提问作者Phedg1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:17:44