3

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

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

4

2 回答 2

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),你有一个无法使用用户名/密码登录的用户,但可以通过 ForeignKey 字段轻松引用。

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

于 2013-04-08T06:27:16.237 回答
0

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

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

  1. 实施associate_by_username

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

    def associate_by_username(details, user=None, *args, **kwargs): """返回与详细信息相同的电子邮件地址的用户条目。""" if user: return None

    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 ( ) 查找它,但由 facebookUsername ( )recipient = UserSocialAuth.objects.filter(uid=target_facebook_id) 创建User(username=target_username)

于 2013-06-08T12:37:57.117 回答