【问题标题】:Facebook Doesn't Return Email Python Social AuthFacebook 不返回电子邮件 Python Social Auth
【发布时间】:2015-11-08 13:14:36
【问题描述】:

这是我在settings.py 中的管道:

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',
    'accounts.pipeline.create_user',
    'accounts.pipeline.update_user_social_data',
    # 'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
)

连同这一行:

SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']

我也试过了:

FACEBOOK_EXTENDED_PERMISSIONS = ['email']

在我的pipeline.py:

def create_user(strategy, details, user=None, *args, **kwargs):
    if user:
        return {
            'is_new': False
        }

    fields = dict((name, kwargs.get(name) or details.get(name))
                  for name in strategy.setting('USER_FIELDS',
                                               USER_FIELDS))

    if not fields:
        return

    if strategy.session_get('signup') == 'UserType1':
        user1 = UserType1.objects.create_user(username=fields.get('username'))
        user1.user_type = User.USERTYPE1
        user1.save()

        return {
            'is_new': True,
            'user': user1
        }

    elif strategy.session_get('signup') == 'UserType2':
        user2 = UserType2.objects.create_user(username=fields.get('username'))
        user2.user_type = User.USERTYPE2
        user2.save()

        return {
            'is_new': True,
            'user': user2
        }


def update_user_social_data(strategy, *args, **kwargs):
    if not kwargs['is_new']:
        return

    full_name = ''
    backend = kwargs['backend']

    user = kwargs['user']

    full_name = kwargs['response'].get('name')
    user.full_name = full_name

    email = kwargs['response'].get('email')
    user.email = email

    user.save()

但是,kwargs['response'].get('name') 正确返回用户的全名,但 kwargs['response'].get('email') 始终为无。当我做print kwargs['response'] 时,它只显示uid 和用户名,所以Facebook 不会返回用户的电子邮件。如何克服这一点?谢谢!

【问题讨论】:

    标签: python django facebook django-socialauth python-social-auth


    【解决方案1】:

    我认为这可能是由于 Facebook 的 Graph API v2.4 发生了变化。

    在以前版本的 API 中,添加了

    SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
    

    将允许您获取 facebook 用户的电子邮件。现在,这还不够,kwargs['response'].get('email') 是空白的。

    但是,正如python social auth issue 675 中所解释的,也添加了这个

    SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
        'fields': 'id,name,email', 
    }
    

    您的设置似乎解决了这个问题,您可以再次获取用户的电子邮件。

    【讨论】:

    • 确实是因为 API 发生了变化,但这对我也不起作用。我不得不提出另一个要求,就像我在回答中写的那样。无论如何,谢谢,我很感激。
    【解决方案2】:

    显然您需要发出另一个请求,如下所示(再次在社交管道中):

    def update_user_social_data(strategy, *args, **kwargs):
        if not kwargs['is_new']:
            return
    
        user = kwargs['user']
    
        fbuid = kwargs['response']['id']
        access_token = kwargs['response']['access_token']
    
        url = u'https://graph.facebook.com/{0}/' \
              u'?fields=email' \
              u'&access_token={1}'.format(
            fbuid,
            access_token,
        )
    
        request = urllib2.Request(url)
        email = json.loads(urllib2.urlopen(request).read()).get('email')
    
        user.email = email
        user.save()
    

    【讨论】:

    • 这可能不会一直有效,因为电子邮件不是拥有 Facebook 帐户的必填字段。要创建 Facebook 帐户,您需要一个但不一定同时拥有电子邮件和移动设备
    • 用户可能决定不在权限访问对话框中泄露他/她的电子邮件地址,您可以检查 kwargs['response']['granted_scopes'] 和 kwargs['response' ]['denied_scopes'] 供参考。要再次提示用户输入电子邮件,您可以将 SOCIAL_AUTH_FACEBOOK_AUTH_EXTRA_ARGUMENTS = {'auth_type': 'rerequest'} 添加到 settings.py。参考:Re-asking for Declined Permissions
    【解决方案3】:

    Facebook 不会将电子邮件 ID 发送到 localhost:8000。在此处查看文档:python-django social auth for FB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多