如何在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拉取生日:
- 先在你的应用里新建一个
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()
- 然后在
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
相关产品推荐
相关产品推荐

