django-social-auth通过facebook_id以编程方式创建新用户

时间:2013-04-07 11:56:56

标签: django django-socialauth

有没有办法创建User和UserSocialAuth对象而没有实际登录但只有你想为其创建帐户的用户的FACEBOOK_ID?

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

2 个答案:

答案 0 :(得分:3)

使用此自定义后端将用户名设置为此人的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)并且您有一个用户无法使用username / pass登录,但可以通过ForeignKey字段轻松引用。

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

答案 1 :(得分:0)

所以我使用了上面描述的想法,但用了很少的努力,最终我得到了以下结论:

我将associate_by_email的{​​{1}}阶段覆盖到我自己的SOCIAL_AUTH_PIPELINE实施阶段。由于用户名在Django auth中是唯一的,我们可以使用它。 所以完全改变

  1. 实施associate_by_username

    来自django.core.exceptions的

    导入MultipleObjectsReturned,ObjectDoesNotExist 来自social_auth.exceptions导入AuthException 来自django.contrib.auth.models导入用户

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

    associate_by_username
  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(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 )查找,但是通过facebookUsername(recipient = UserSocialAuth.objects.filter(uid=target_facebook_id) )创建