django-allauth不保存社交信息

时间:2014-10-08 02:58:06

标签: django django-allauth

所以我从一开始就全面披露我对Django和django-allauth都很新。

现在已经不在了,我遇到的问题是,当用户通过社交网站登录时(我一直在尝试Google和Facebook),从网站上检索到的数据都没有被提取进入用户的数据字段。进行身份验证后,仍会提示用户输入电子邮件,并且所有名称字段都留空。我尝试通过创建自定义适配器手动修复此问题,但这也不起作用。通过使用打印语句,我可以看到数据正在从网站上获取 - 只是没有保存到用户的属性。

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

注意:使用Django 1.7和Python 3.4.1

编辑: Django-allauth成功创建用户并将用户链接到社交帐户,该帐户包含从社交网站获取的所有数据,但这些数据都没有填充User对象中的字段,如email,first_name和last_name。

以下是settings.py中的django-allauth配置设置:

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' } },
}

这是我在我的自定义适配器中的代码(通过使用print语句,我可以说是使用和处理正确的数据),我试图手动将字段保存到用户对象中

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()

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

1 个答案:

答案 0 :(得分:0)

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