使用expo-auth-session调用Facebook Graph API无法获取用户生日
问题:使用expo-auth-session无法从Facebook Graph API获取用户生日
我试过类似的已解决方案,但都不适用。目前用expo-auth-session调用Facebook Graph API时,能成功获取用户ID、邮箱和姓名,但拿不到生日。我已经通过了应用审核权限,以下是我的代码,请问哪里遗漏了?
初始请求代码
const [request, response, promptAsync] = Facebook.useAuthRequest({ // clientId: '2877415105738397', androidClientId: FacebookClientId, iosClientId: FacebookClientId, expoClientId: FacebookClientId, scopes: ['user_birthday '], redirectUri: makeRedirectUri({ useProxy: true }) });
获取access_token后调用接口
await axios.get(`https://graph.facebook.com/v15.0/me?fields=id,name,email,birthday&access_token=${token}`)
返回结果仅包含:
{"email": "email@gmail.com", "id": "123415656565", "name": "Name"}
更新:完整组件代码
import * as React from 'react'; import { View, Platform } from 'react-native'; import * as AppAuth from 'expo-auth-session'; import { useAuthRequest } from 'expo-auth-session/build/providers/Facebook'; import { FacebookClientId } from '../config/constant'; import { TouchableOpacity } from 'react-native'; import { FacebookIcon } from '../assets/SvgIcons/FacebookIcon'; import { Styling } from '../assets/style/styling'; import { useEffect, useState } from 'react'; import { onSignupExternal } from '../store/user/user.action'; import { useNavigation } from '@react-navigation/core'; import { useDispatch, useSelector } from 'react-redux'; const useProxy = Platform.select({ web: false, default: true, 'android': true, 'ios': true }); const discovery = { authorizationEndpoint: 'https://www.facebook.com/v6.0/dialog/oauth', tokenEndpoint: 'https://graph.facebook.com/v6.0/oauth/access_token', }; export const FaceBook = ({ setLoading }) => { const [userData, setUserData] = useState({}) const navigation = useNavigation() const dispatch = useDispatch(); const { user } = useSelector((storeState) => storeState.userModule); const clientId = FacebookClientId; const scopes = ['public_profile', 'email', 'user_birthday']; const [request, response, promptAsync] = useAuthRequest( { clientId, scopes, useProxy, redirectUri: AppAuth.makeRedirectUri({ native: 'com.myapp.app:/', useProxy, }), }, {useProxy: useProxy}, discovery ); async function handlePress() { try { const result = await promptAsync(); if (result.type === 'success') { setLoading(true) getUserData(result.params.access_token) } else { console.log('Login failed :(', result); } } catch (e) { console.error(e); } } async function getUserData(token) { let response = await fetch(`https://graph.facebook.com/me?fields=id,name,email,birthday&access_token=${token}`); const userInfo = await response.json() console.log(userInfo) setUserData({ user_email: userInfo.email, user_id: userInfo.id, user_full_name: userInfo.name, user_ref_id: null, auth_system: 'Facebook', user_dob: null }) } useEffect(() => { const getUser = async () => { let updateUserData = userData return Object.keys(userData).length !== 0 && dispatch(onSignupExternal(userData)) }; getUser() }, [userData]) useEffect(() => { if (user !== null && user?.user_id !== undefined) { setLoading(false) return navigation.navigate("Dashboard") } }, [user]) return ( <TouchableOpacity style={Styling.facebookLoginBtn} onPress={handlePress}> <View style={Styling.googleIcon}><FacebookIcon /></View> </TouchableOpacity> ) }
解决方案
检查以下几个关键问题:
统一Graph API版本
你的授权请求用的是v6.0端点,但获取用户数据时调用的是无版本号的默认端点,Facebook不同API版本对user_birthday权限的返回规则有差异。将请求统一为v15.0或更高版本:let response = await fetch(`https://graph.facebook.com/v15.0/me?fields=id,name,email,birthday&access_token=${token}`);确认权限有效性
- 检查用户的Facebook账号是否填写并公开了生日信息(部分用户可能隐藏或未设置)
- 确认Facebook开发者后台中,
user_birthday权限已通过审核,且当前使用的ClientID属于该审核通过的应用 - 授权弹窗中需明确出现“访问你的生日”的提示,确保用户已同意该权限
调试access_token权限
用Facebook开发者工具中的Access Token Debugger检查你的token是否包含user_birthday权限。如果权限缺失,说明授权流程中scopes传递异常,需重新确认scopes数组的正确性。修复代码细节问题
- 初始请求代码中
scopes: ['user_birthday ']多了一个空格,会导致权限识别失败(完整代码中已修正,需避免此类拼写错误) - 完整组件代码中需补充
Platform的导入:import { View, Platform } from 'react-native';
- 初始请求代码中
内容的提问来源于stack exchange,提问作者JoelE
相关产品推荐
相关产品推荐

