Flutter应用通过Facebook登录时Firebase用户邮箱为空如何解决
问题根因
- 你当前的Facebook登录请求未正确申请
email权限:从你提供的Facebook授权通知截图可以看到,登录时仅申请了公开个人资料权限,没有包含邮箱访问权限,因此Facebook不会返回邮箱字段,Firebase侧存储的email自然为null - 就算申请了
email权限,也存在两种特殊情况会返回空邮箱:用户Facebook账号未绑定有效邮箱、用户在授权弹窗中手动拒绝了邮箱访问申请 - 调用Facebook Graph API拉取用户信息时未显式指定返回
email字段,就算已经拿到授权,API默认也不会返回该字段
解决步骤
1. 调整登录权限申请逻辑
以常用的flutter_facebook_auth依赖包为例,登录时必须在权限列表中添加email:
final LoginResult loginResult = await FacebookAuth.instance.login( permissions: ['public_profile', 'email'], );
2. 显式指定拉取字段
登录成功后拉取用户信息时,必须在fields参数中加入email:
if (loginResult.status == LoginStatus.success) { final userInfo = await FacebookAuth.instance.getUserData( fields: 'id,name,email,picture.width(200)', ); // 此处可以先判断userInfo['email']是否为空,做后续逻辑处理 }
3. 检查Facebook开发者后台配置
进入对应应用的Facebook开发者后台:
- 打开「Facebook登录」-「设置」页面,确认公共权限中已添加
email权限 - 如果应用已对外发布,需要完成
email权限的合规审核,否则仅测试用户能正常拿到邮箱字段
4. 兼容边界场景
如果完成以上配置后仍有用户邮箱为空,属于正常场景(用户无绑定邮箱/主动拒绝授权),可在应用内增加引导弹窗,让用户手动补全邮箱后更新到Firebase Auth:
User? currentUser = FirebaseAuth.instance.currentUser; if (currentUser != null && currentUser.email == null) { // 引导用户输入邮箱后执行更新 await currentUser.updateEmail("用户填写的有效邮箱"); // 可选:触发邮箱验证流程 await currentUser.sendEmailVerification(); }
内容的提问来源于stack exchange,提问作者zain ishfaq
相关产品推荐
相关产品推荐

