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
相关产品推荐
相关产品推荐

