Facebook 不 Return 电子邮件 Python 社交身份验证
Facebook Doesn't Return Email Python Social Auth
这是我在 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')
returns 用户的全名正确,但 kwargs['response'].get('email')
始终是 none。当我执行 print kwargs['response']
时,它也只显示 uid 和用户名,因此 Facebook 不会 return 用户的电子邮件。如何克服这个?谢谢!
显然您需要发出另一个请求,例如以下(再次在社交管道中):
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 的 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',
}
您的设置似乎可以解决这个问题,您可以再次收到用户的电子邮件。
Facebook 不会向 localhost:8000 发送电子邮件 ID。在此处查看文档:python-django social auth for FB
这是我在 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')
returns 用户的全名正确,但 kwargs['response'].get('email')
始终是 none。当我执行 print kwargs['response']
时,它也只显示 uid 和用户名,因此 Facebook 不会 return 用户的电子邮件。如何克服这个?谢谢!
显然您需要发出另一个请求,例如以下(再次在社交管道中):
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 的 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',
}
您的设置似乎可以解决这个问题,您可以再次收到用户的电子邮件。
Facebook 不会向 localhost:8000 发送电子邮件 ID。在此处查看文档:python-django social auth for FB