有没有办法创建User和UserSocialAuth对象而没有实际登录但只有你想为其创建帐户的用户的FACEBOOK_ID?
我正在创建一个简单的应用程序,用户可以从FB中选择朋友并为他创建一些模型对象。由于我引用了User实体,我需要知道该朋友是否已注册。如果不是,我需要以编程方式创建整个对象图。可以使用django-social-auth的标准功能,还是应该手动创建“auth_user”和“social_auth_usersocialauth”中的记录?
答案 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中是唯一的,我们可以使用它。
所以完全改变
实施associate_by_username
导入MultipleObjectsReturned,ObjectDoesNotExist 来自social_auth.exceptions导入AuthException 来自django.contrib.auth.models导入用户
def associate_by_username(详情,用户=无,* args,** kwargs): msgstr“”“返回用户条目,其电子邮件地址与详细信息相同。”“ 如果用户: 返回无
associate_by_username
然后我将此方法添加到管道
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', )
当我需要获取用户时,我会通过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)
)创建