【问题标题】:How to populate user profile with django-allauth provider information?如何使用 django-allauth 提供者信息填充用户配置文件?
【发布时间】:2013-01-09 12:00:50
【问题描述】:

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

谢谢!!!

【问题讨论】:

    标签: django facebook authentication django-allauth


    【解决方案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',
        ]
    }
    

    字段会自动拉过。

    【讨论】:

    • 你怎么知道有哪些SCOPEPROFILE_FIELDS键值可用?
    • 该选项取决于提供者。目前它仅适用于 LinkedIn
    【解决方案2】:

    这是@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 变量感到困惑。然后看看文档:

    脸书:

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

    链接:

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

    推特:

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

    希望对您有所帮助。 :)

    【讨论】:

      【解决方案3】:

      我是这样做的,以图片(字段)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']
      

      确保导入:from allauth.socialaccount.models import SocialAccount

      【讨论】:

        【解决方案4】:

        用户成功后发送pre_social_login信号 通过社交提供者进行身份验证,但在实际登录之前 处理。该信号是针对社交登录、注册和何时发出的 将其他社交帐户关联到一个帐户。

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

        相反,我建议您使用allauth.account.signals.user_signed_up,它会为所有用户发出,包括本地用户和社交用户。

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

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

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

        【讨论】:

        • 我不得不这样使用它:kwargs.get('user').socialaccount_set.filter(provider='facebook').extra_data 但是当我这样做时,我得到这个错误:AttributeError at /accounts/facebook/login/callback/ 'QuerySet' 对象没有属性 'extra_data' 感谢您的回答!你的应用很棒
        • 糟糕,我的例子错了(我刚刚更正了)。我忘了从查询集([0])中选择一个项目,如:“.filter(...)[0]...”
        • 可以访问 sociallogin 参数中的好东西,例如sociallogin.account.get_provider_display(), sociallogin.account.get_avatar_url(), sociallogin.account.get_profile_url(), sociallogin.account.provider, sociallogin.account.extra_data['screen_name'] ...
        猜你喜欢
        • 2012-08-31
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2018-01-27
        相关资源
        最近更新 更多