python 社交身份验证和 django,使用 Facebook 时电子邮件为空 api 2.4

python social auth and django, email empty with Facebook api 2.4

我在我的 django 项目中使用 python 社交身份验证来提供 Facebook 登录功能。我可以在弹出窗口中看到 Facebook 提供的电子邮件。但它在我的部分管道中是空的。除了 api 版本(以前是 2.3,现在是 2.4)之外,相同的代码在我的其他 Facebook 应用程序中运行良好,设置完全相同。也没有将 Facebook api 版本更改为 2.3 的选项。 我的 python-social-auth 版本是 0.2.12 以下是我的设置文件中的相关数据

SOCIAL_AUTH_FACEBOOK_SCOPE = ['email',]
FACEBOOK_EXTENDED_PERMISSIONS = ['email',]
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['email',]
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'home.pipeline.require_email',
    'social.pipeline.social_auth.associate_by_email',  # <--- enable this one
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    'home.pipeline.send_welcome_mail',
)

SOCIAL_AUTH_FACEBOOK_KEY = os.environ['SOCIAL_AUTH_FACEBOOK_KEY']
SOCIAL_AUTH_FACEBOOK_SECRET = os.environ['SOCIAL_AUTH_FACEBOOK_SECRET']

这是我自定义的部分管道函数

@partial
def require_email(strategy, backend, uid, details, user=None, *args, **kwargs):
    print details
    #some stuff......

此函数打印空电子邮件 ID,如下所示

{'username': u'Anurag Jain', 'fullname': u'Anurag Jain', 'last_name': u'Jain', 'email': '', 'first_name': u'Anurag'}

谁能帮我解决这个问题。

事实证明,在 Facebook api v2.4 中进行了一些更改,导致电子邮件为空。已经有一个 issue open for this https://github.com/omab/python-social-auth/issues/675

解决办法是在django配置文件中添加如下设置

SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id,name,email', # needed starting from protocol v2.4
}