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

使用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}`);
    
  • 确认权限有效性

    1. 检查用户的Facebook账号是否填写并公开了生日信息(部分用户可能隐藏或未设置)
    2. 确认Facebook开发者后台中,user_birthday权限已通过审核,且当前使用的ClientID属于该审核通过的应用
    3. 授权弹窗中需明确出现“访问你的生日”的提示,确保用户已同意该权限
  • 调试access_token权限
    用Facebook开发者工具中的Access Token Debugger检查你的token是否包含user_birthday权限。如果权限缺失,说明授权流程中scopes传递异常,需重新确认scopes数组的正确性。

  • 修复代码细节问题

    1. 初始请求代码中scopes: ['user_birthday ']多了一个空格,会导致权限识别失败(完整代码中已修正,需避免此类拼写错误)
    2. 完整组件代码中需补充Platform的导入:import { View, Platform } from 'react-native';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:00:59