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

如何在Django中通过python-social-auth获取Facebook用户生日?

我之前也碰到过一模一样的问题!问题根源在于:虽然你已经请求了user_birthday权限,但Facebook Graph API默认只会返回最基础的用户字段(比如id、name),不会主动返回生日这类需要额外权限的字段,得明确告诉API你要获取哪些信息才行。

下面给你两种可行的解决方案,按需选就行:

方案1:通过配置让social-auth自动获取生日

直接在Django的settings.py里添加配置,指定请求Facebook API时要获取的字段:

SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id, name, email, birthday'  # 把birthday加进请求字段列表
}

这样social-auth在获取用户信息的阶段,就会自动向Facebook请求这些字段,之后你打印的response字典里应该就能看到birthday字段了。

方案2:在pipeline中手动调用API获取生日

如果方案1没生效,或者你需要更灵活的处理逻辑,可以写一个自定义的pipeline函数,用拿到的access_token主动调用Facebook Graph API拉取生日:

  1. 先在你的应用里新建一个pipeline.py文件,添加以下函数:
import requests

def fetch_facebook_birthday(backend, user, response, *args, **kwargs):
    # 只处理Facebook登录的情况
    if backend.name != 'facebook':
        return
    
    access_token = response.get('access_token')
    if not access_token:
        return
    
    # 调用Facebook Graph API,注意替换成当前最新的API版本(比如v18.0)
    api_url = f'https://graph.facebook.com/v18.0/me?fields=birthday&access_token={access_token}'
    fb_api_response = requests.get(api_url)
    fb_user_data = fb_api_response.json()
    
    birthday = fb_user_data.get('birthday')
    if birthday:
        # 假设你的User模型有birthday字段,这里把生日存进去
        user.birthday = birthday
        user.save()
  1. 然后在settings.py里把这个函数加到SOCIAL_AUTH_PIPELINE中,放在创建用户之后、关联用户的步骤附近:
SOCIAL_AUTH_PIPELINE = (
    # 保留默认的pipeline步骤
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.auth_allowed',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.user.create_user',
    # 插入自定义的生日获取函数
    'your_app_name.pipeline.fetch_facebook_birthday',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

额外注意事项

  • 权限审核:如果你的Facebook应用是公开上线的,user_birthday权限需要通过Facebook的审核,否则只有测试用户能返回生日信息。
  • 用户隐私设置:哪怕你有权限,用户也可能在Facebook隐私设置里禁止应用访问自己的生日,这种情况API会返回空值。
  • API版本:记得使用Facebook当前支持的Graph API版本,避免因版本过旧导致请求失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:43:03