17

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

我正在尝试使用 pre_social_login 信号,但我只是不知道如何从提供者身份验证中检索数据

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

4 回答 4

23

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

所以它是在注册完全完成之前发送的——因此这不是正确使用的信号。

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

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

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

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

于 2013-01-25T15:18:48.097 回答
10

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

假设您的配置文件模型具有以下 3 个字段:first_name, email,picture_url

视图.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" 文档

链接:

picture_url = user_data['picture-urls']['picture-url'] 文档

推特:

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

希望有帮助。:)

于 2018-01-10T07:50:41.070 回答
1

我就是这样做的,以图片(字段)url和google provider(字段)为例。

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

于 2014-01-28T05:30:35.433 回答
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',
    ]
}

字段会自动拉过。

于 2019-01-16T13:26:39.753 回答