【问题标题】:django-social-auth create new user programmatically by facebook_iddjango-social-auth 通过 facebook_id 以编程方式创建新用户
【发布时间】:2013-04-07 11:56:56
【问题描述】:

有没有什么方法可以创建 User 和 UserSocialAuth 对象而无需实际登录但只有您要为其创建帐户的用户的 FACEBOOK_ID?

我正在创建一个简单的应用程序,用户可以在其中从 FB 中选择一个朋友并为他创建一些模型对象。由于我引用了用户实体,因此无论该朋友是否已注册,我都需要拥有它。如果不是,我需要以编程方式创建整个对象图。可以使用 django-social-auth 的标准功能,还是应该手动在“auth_user”和“social_auth_usersocialauth”中创建记录?

【问题讨论】:

    标签: django django-socialauth


    【解决方案1】:

    使用此自定义后端将用户名设置为人员的 FACEBOOK_ID。

    from social_auth.backends.facebook import FacebookBackend
    class IDFacebookBackend(FacebookBackend):
        """Facebook OAuth2 authentication backend"""
        def get_user_details(self, response):
            """Return user details from Facebook account"""
            return {'username': response.get('id'),
                    'email': response.get('email', ''),
                    'fullname': response.get('name', ''),
                    'first_name': response.get('first_name', ''),
                    'last_name': response.get('last_name', '')}
    

    在您的身份验证管道中使用此版本的get_username 而不是social_auth.backends.pipeline.user.get_username

    def get_username(details, user=None, *args, **kwargs):
        " Make Username from User Id "
        if user:
            return {'username': UserSocialAuth.user_username(user)}
        else:
            return details['username']
    

    您的管道应如下所示:

    SOCIAL_AUTH_PIPELINE = (
        'social_auth.backends.pipeline.social.social_auth_user',
        'our_custom_auth.get_username', # <= This should be the previous function
        'social_auth.backends.pipeline.user.create_user',
        'social_auth.backends.pipeline.social.associate_user',
        'social_auth.backends.pipeline.social.load_extra_data',
        'social_auth.backends.pipeline.user.update_user_details'
    )
    

    那么您需要做的就是调用User.objects.create(username=friends_facebook_id) 并且您有一个无法使用用户名/密码登录的用户,但可以通过 ForeignKey 字段轻松引用。

    此外,当“朋友”日后加入您的网站(使用 SocialAuth)时,他们将自动获得此用户对象,并且您的内部图表将保持准确。

    【讨论】:

    • 非常感谢!这正是我所需要的!
    • 嗨,现在我正在尝试实现它,但它不起作用。首先它抱怨 UserSocialAuth 没有 user_username(我使用的是 Django 1.5.1)此时我的数据库中填充了现有用户。然后我重新创建了架构,现在它甚至没有达到'get_username'方法并得到这个:文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/ auth/__init__.py", line 66, in authenticate user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) AttributeError: 'unicode' object has no attribute 'backend'
    • 请创建一个新问题并包含堆栈跟踪,我会帮助您完成它。使用指向新问题的链接回复此评论。
    【解决方案2】:

    所以我使用了上面描述的想法,但不费吹灰之力,最终我得到了以下结果:

    我将associate_by_email 阶段从SOCIAL_AUTH_PIPELINE 覆盖为我自己的associate_by_username 实现。由于用户名在 Django auth 中是唯一的,我们可以使用它。 所以完全的变化是

    1. 实现associate_by_username

      从 django.core.exceptions 导入 MultipleObjectsReturned, ObjectDoesNotExist 从 social_auth.exceptions 导入 AuthException from django.contrib.auth.models 导入用户

      def associate_by_username(详细信息,用户=无,*args,**kwargs): """返回用户条目,其电子邮件地址与返回的详细信息相同。""" 如果用户: 返回无

      username = details.get('username')
      
      if username:
          try:
              return {'user': User.objects.get(username=username)}
          except MultipleObjectsReturned:
              raise AuthException(kwargs['backend'], 'Not unique email address.')
          except ObjectDoesNotExist:
              pass
      
    2. 然后我将此方法添加到管道中

      SOCIAL_AUTH_PIPELINE = ( 'social_auth.backends.pipeline.social.social_auth_user', 'core.auth.associate_by_username', 'social_auth.backends.pipeline.user.get_username', 'social_auth.backends.pipeline.user.create_user', 'social_auth.backends.pipeline.social.associate_user', 'social_auth.backends.pipeline.social.load_extra_data', 'social_auth.backends.pipeline.user.update_user_details', )

    3. 当我需要获取用户时,我通过 facebookId (recipient = UserSocialAuth.objects.filter(uid=target_facebook_id) ) 查找它,但通过 facebookUsername (User(username=target_username)) 创建

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2015-12-21
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多