如何使用django-allauth提供程序信息填充用户配置文件?

时间:2013-01-25 13:57:05

标签: django facebook authentication django-allauth

我正在使用django-allauth作为我的身份验证系统。我需要当用户登录时,配置文件模块会填充提供商信息(在我的情况下是facebook)。

我正在尝试使用pre_social_login信号,但我只是不知道如何从提供程序auth中检索数据

from django.dispatch import receiver
from allauth.socialaccount.signals import pre_social_login

@receiver(pre_social_login)

def populate_profile(sender, **kwargs):
    u = UserProfile( >>FACEBOOK_DATA<< )
    u.save()

感谢!!!

4 个答案:

答案 0 :(得分:18)

用户成功发送pre_social_login信号 通过社交提供商进行身份验证,但实际登录之前 处理。此信号是为社交登录,注册和何时发出的 将其他社交帐户连接到帐户。

因此在注册完全完成之前发送 - 因此这不是正确的信号。

相反,我建议你使用allauth.account.signals.user_signed_up,这是为所有用户,本地和社交用户发出的。

在该处理程序中,您可以检查附加到用户的SocialAccount。例如,如果您要检查Google+特定数据,请执行以下操作:

user.socialaccount_set.filter(provider='google')[0].extra_data

更新:最新的开发版本通过传递直接包含所有相关信息的sociallogin参数(社交帐户,令牌,...)来使这更方便一点/ p>

答案 1 :(得分:5)

以下是@ pennersr解决方案的具体示例:

确认您的个人资料模型包含以下3个字段:first_nameemailpicture_url

<强> views.py:

@receiver(user_signed_up)
def populate_profile(sociallogin, user, **kwargs):    

    if sociallogin.account.provider == 'facebook':
        user_data = user.socialaccount_set.filter(provider='facebook')[0].extra_data
        picture_url = "http://graph.facebook.com/" + sociallogin.account.uid + "/picture?type=large"            
        email = user_data['email']
        first_name = user_data['first_name']

    if sociallogin.account.provider == 'linkedin':
        user_data = user.socialaccount_set.filter(provider='linkedin')[0].extra_data        
        picture_url = user_data['picture-urls']['picture-url']
        email = user_data['email-address']
        first_name = user_data['first-name']

    if sociallogin.account.provider == 'twitter':
        user_data = user.socialaccount_set.filter(provider='twitter')[0].extra_data
        picture_url = user_data['profile_image_url']
        picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1]
        email = user_data['email']
        first_name = user_data['name'].split()[0]

    user.profile.avatar_url = picture_url
    user.profile.email_address = email
    user.profile.first_name = first_name
    user.profile.save()         

如果您对每个提供商中的picture_url变量感到困惑。然后看看文档:

<强> Facebook的:

picture_url = "http://graph.facebook.com/" + sociallogin.account.uid + "/picture?type=large" Docs

<强> LinkedIn:

picture_url = user_data['picture-urls']['picture-url'] Docs

<强> Twitter的:

picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1] Docsrsplit()看看here

希望有所帮助。 :)

答案 2 :(得分:1)

我这样做并以图片(字段)网址和谷歌提供商(字段)为例。

socialaccount_obj = SocialAccount.objects.filter(provider='google', user_id=self.user.id)
   picture = "not available"
   if len(socialaccount_obj):
            picture = socialaccount_obj[0].extra_data['picture']

确保导入:从allauth.socialaccount.models导入SocialAccount

答案 3 :(得分:1)

有一种更简便的方法。

只需将以下内容添加到您的settings.py中。例如,链接到...

SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
    'SCOPE': [
        'r_basicprofile',
        'r_emailaddress'
    ],
    'PROFILE_FIELDS': [
        'id',
        'first-name',
        'last-name',
        'email-address',
        'picture-url',
        'public-profile-url',
    ]
}

这些字段会自动显示。