如何通过Facebook OAuth2的Access Token获取用户public_profile信息(含邮箱)
解决Facebook登录获取邮箱及扩展用户信息的问题
你已经成功拿到了基础的access token和用户信息,但在权限配置和用户信息请求环节有两个关键问题,导致无法获取邮箱及更多public_profile相关内容,下面一步步帮你修正:
1. 精简并修正Scope权限参数
你当前的scope里包含了多个已废弃的Facebook Graph API权限(比如read_stream、publish_actions、offline_access),这些权限在v12.0及以后版本已经失效,反而会干扰正常的权限请求。你需要把scope精简为实际需要的有效权限:
email:用于获取用户邮箱user_birthday:用于获取生日(需要用户授权,上线前需通过Facebook应用审核)user_about_me:用于获取用户的"关于我"信息- 补充:
public_profile是默认权限,无需额外声明,它包含name、头像、性别等基础信息
修正后的scope配置:
scope:"email,user_birthday,user_about_me"
2. 在Graph API请求中显式指定需要的字段
调用/me端点时,Facebook默认只返回id和name两个字段,必须显式声明你需要的字段才能获取邮箱、生日等扩展信息。你需要在请求中添加fields参数。
修改后的getFbUser函数:
const getFbUser = async (access_token, token_type) => { const fbUser = await axios .get( `https://graph.facebook.com/me`, { headers: { Authorization: `Bearer ${access_token}`, "Content-Type": "application/json", }, params: { fields: "id,name,email,birthday,about" // 这里列出你需要的所有字段 } } ) .then((res) => res.data) .catch((error) => { console.error(`Failed to fetch user:`, error.response.data); throw new Error(error.message); }); console.log('fbUser',fbUser) return fbUser; };
额外注意事项
- 邮箱获取的前提:用户的Facebook账号必须绑定了邮箱,且在授权流程中同意了
email权限请求。如果用户拒绝授权或无绑定邮箱,返回结果中不会包含email字段,你的代码要做好容错处理。 - 特殊权限审核:像
user_birthday这类非基础权限,应用上线前需要提交Facebook官方审核,审核通过后才能对所有用户生效,测试阶段可以用Facebook测试账号验证功能。 - API版本适配:确保你使用的Graph API版本(v12.0)和权限要求匹配,避免调用已废弃的接口。
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

