django-allauth不保存社交信息

4

首先进行全面披露,我对Django和django-allauth都比较新。

现在问题是,当用户通过社交网站登录(我尝试了Google和Facebook),从该网站检索的所有数据都没有被提取到用户的数据字段中。认证后,用户仍然需要输入电子邮件,而所有名称字段都为空白。我尝试通过创建自定义适配器手动修复此问题,但也没有起作用。通过使用打印语句,我可以看到数据被很好地获取了-只是没有保存到用户的属性中。

请纠正我如果我理解错了,但通过阅读文档和django-allauth的一些源代码,我认为社交授权会通过DefaultSocialAccountAdapter类中的populate_user(self, request, sociallogin, data):钩子自动保存用户的电子邮件和名字,请注意,因此我甚至不必处理解决方法。因此,我猜我只是在做一些愚蠢的事情,这对我产生了影响......虽然如果有一个聪明的解决方法可以解决这个问题,那就太好了,因为我还没有更好的解决方案。

注意:使用Django 1.7和Python3.4.1

编辑:Django-allauth成功创建了一个用户并将用户链接到一个社交帐户,该帐户包含从社交网站获取的所有数据,但是那些数据没有填充到用户对象中的字段中,例如电子邮件、名字和姓氏。

这是我的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()

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


你能让社交部分工作了吗?如果是这样,请检查 Django Auth 的用户表,它必须有一个由 Django-Allauth 创建的用户。你不需要为此编写配置文件适配器。 - Dhiraj Thakur
是的,django-allauth正在创建用户,我可以看到社交令牌已链接到用户,但用户的任何字段(例如first_name、last_name、email)都没有填充。 - rfj001
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接