2014-10-08 29 views
2

因此,我将从一开始就充分披露我对Django和django-allauth都很新颖。django-allauth不保存社交信息

既然这样,我遇到的问题是,当用户通过社交网站登录(我一直在尝试Google和Facebook)时,从网站检索到的数据都不是拉入用户的数据字段。在认证之后,仍然提示用户输入电子邮件,并且所有名称字段都留空。我试图通过创建一个自定义适配器来手动解决这个问题,但是这也不起作用。从使用打印语句,我可以看到数据正在从站点获取 - 它只是没有被保存到用户的属性。

纠正我,如果我错了,但通过阅读文档和django-allauth的一些来源,我的印象是,社会授权通过populate_user(self, request, sociallogin, data):钩子自动保存用户的电子邮件和名字和姓氏在DefaultSocialAccountAdapter班,所以我真的不应该处理变通办法。 因此,我在猜测我只是在做一些愚蠢的事情,这让我觉得这很糟糕......虽然如果有一个聪明的解决方法可以解决这个问题,我会很好,因为缺乏更好的解。

注:使用Django 1.7和Python 3.4.1

编辑: Django的allauth是在成功创建用户和用户链接到社交帐户,它包含了所有从获取的数据社交网站,但没有任何数据填充用户对象中的字段,如电子邮件,名字和姓氏。

这里是我的Django allauth配置设置settings.py:

ACCOUNT_AUTHENTICATION_METHOD = "email" 
ACCOUNT_EMAIL_REQUIRED = True 
ACCOUNT_EMAIL_VERIFICATION = "required" 
ACCOUNT_USERNAME_REQUIRED = False 
SOCIALACCOUNT_AUTO_SIGNUP = True 

# The following line was uncommented when I was trying to use my own adapter 
# SOCIALACCOUNT_ADAPTER = 'profiles.profile_adapter.ProfileAdapter' 

SOCIALACCOUNT_PROVIDERS = { 
    'facebook': 
     { 'SCOPE': ['email'], 
      'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 
      'METHOD': 'oauth2', 
      'LOCALE_FUNC': lambda request: 'en_US'}, 
    'google': 
     { 'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile'], 
      'AUTH_PARAMS': { 'access_type': 'online' } }, 
} 

,这里是我在自定义适配器(其中,必须通过使用打印语句的代码,我可以告诉已经习惯和处理正确的数据),其中我试图字段手动保存到用户对象

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 

class ProfileAdapter(DefaultSocialAccountAdapter): 

def pre_social_login(self, request, sociallogin): 
    ''' 
    Check for extra user data and save the desired fields. 
    ''' 
    data = sociallogin.account.extra_data 
    user = sociallogin.account.user 
    print("LOGS: Caught the signal -> Printing extra data of the account: \n" + str(data)) 
    if 'first_name' in data: 
     user.first_name = data['first_name'] 
    elif 'given_name' in data: 
     user.first_name = data['given_name'] 
    if 'last_name' in data: 
     user.last_name = data['last_name'] 
    elif 'family_name' in data: 
     user.last_name = data['family_name'] 
    user.save() 

上面的代码建立在不链接到任何社会帐户数据库中的用户,但包含C正确的名字和姓氏。然后用户被重定向到一个表单,表示他们使用社交帐户登录,并提示输入电子邮件地址。提交此表单后,创建的原始用户将被新用户覆盖,链接到社交帐户,包含输入到表单中的电子邮件,但没有填写姓氏或姓氏字段。

+0

你是否得到社会部分的工作?如果是这样,请检查django auth的用户表,它必须有由django-allauth创建的用户。您不必为此写入配置文件适配器。 – 2014-10-08 09:15:18

+0

是的,django-allauth正在创建用户,并且我可以看到社交令牌链接到用户,但用户的所有字段(即,名字,姓氏,电子邮件)都没有填充。 – rfj001 2014-10-08 12:35:31

回答

0

问题在于,当从社交媒体网站获取的数据中未包含电子邮件时,django-allauth会要求在后续表单中创建电子邮件以创建该帐户。当从此表单创建帐户时,django-allauth将不会使用从社交媒体获取的数据来填充字段。我认为这是django-allauth的问题。