我有django社交认证安装(从omab),并且用户有一个电子邮件地址在数据库中,这是我想保留的,但当用户登录从facebook使用social-auth,他们的电子邮件被他们在facebook账户中的电子邮件取代。我不确定这些设置是否为默认设置,也无法找到如何阻止此行为。如何不设置用户的电子邮件地址在Django社会认证
9
A
回答
5
我发现,在pipeline的负责就是
social_auth.backends.pipeline.user.update_user_details
我刚刚从管线上拆下了它,现在像电子邮件地址和姓名的细节留给用户填写。
3
我发布我的解决方案(更新用户的详细信息,而不是覆盖它们),以便它可以帮助某人。基于pipeline.user.update_user_details
我编写如下:
def fill_user_details(backend, details, response, user, is_new=False, *args,
**kwargs):
"""Fills user details using data from provider, without overwriting
existing values.
backend: Current social authentication backend
details: User details given by authentication provider
response: ?
user: User ID given by authentication provider
is_new: flag
source: social_auth.backends.pipeline.user.update_user_details
"""
# Each pipeline entry must return a dict or None, any value in the dict
# will be used in the kwargs argument for the next pipeline entry.
#
# If any function returns something else beside a dict or None, the
# workflow will be cut and the value returned immediately, this is useful
# to return HttpReponse instances like HttpResponseRedirect.
changed = False # flag to track changes
for name, value in details.iteritems():
# do not update username, it was already generated
if name in (USERNAME, 'id', 'pk'):
continue
# set it only if the existing value is not set or is an empty string
existing_value = getattr(user, name, None)
if value is not None and (existing_value is None or
not is_valid_string(existing_value)):
setattr(user, name, value)
changed = True
# Fire a pre-update signal sending current backend instance,
# user instance (created or retrieved from database), service
# response and processed details.
#
# Also fire socialauth_registered signal for newly registered
# users.
#
# Signal handlers must return True or False to signal instance
# changes. Send method returns a list of tuples with receiver
# and it's response.
signal_response = lambda (receiver, response): response
signal_kwargs = {'sender': backend.__class__, 'user': user,
'response': response, 'details': details}
changed |= any(filter(signal_response, pre_update.send(**signal_kwargs)))
# Fire socialauth_registered signal on new user registration
if is_new:
changed |= any(filter(signal_response,
socialauth_registered.send(**signal_kwargs)))
if changed:
user.save()
9
你试过SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)
从手册:
的update_user_details管线处理器将设置 用户对象的某些字段,如电子邮件。这组到字段列表,你只 要为新创建的用户设置:
SOCIAL_AUTH_PROTECTED_USER_FIELDS = [“邮件”,]
而且更多额外的价值将被保存,如果定义。有关此 设置的详细信息在下面的OpenId和OAuth部分中列出。
相关问题
- 1. django注册不能设置“从”电子邮件地址认证电子邮件
- 2. 如何跳过用户确认使用电子邮件omniauth(社会认证)
- 3. 社会认证django:多个用户冲突相同的电子邮件ID
- 4. 蟒蛇 - 社会 - 身份验证 - 更新电子邮件地址
- 5. Django在forms.py中验证电子邮件地址和用户名
- 6. Django电子邮件地址
- 7. 如何验证电子邮件地址
- 8. Django:设置电子邮件的发件人地址
- 9. django社交认证整合“注册与电子邮件”
- 10. django社交认证注册Facebook电子邮件
- 11. 在Cocoa中获取用户的默认电子邮件地址
- 12. Powerbi用户的电子邮件地址
- 13. 社会认证django
- 14. django的电子邮件认证
- 15. 当点击电子邮件地址时设置默认主题
- 16. 如何使用gomail设置回复电子邮件地址
- 17. 电子邮件地址与社会登录唯一
- 18. 在Django中接受电子邮件地址作为用户名
- 19. 仅显示用户名而不是电子邮件地址设计确认电子邮件
- 20. 如何在MVC中发送电子邮件地址验证电子邮件?
- 21. 如何确认在Android应用用户的电子邮件地址编程
- 22. ASP.NET的电子邮件地址验证
- 23. 修改“查看会员电子邮件地址”设置
- 24. Drupal 7 - 确认电子邮件地址
- 25. 设计Ominauth不会保存用户模型中的电子邮件地址
- 26. Python的社会验证复制的电子邮件为不同的用户
- 27. 在电子邮件地址
- 28. 如何取得用户的电子邮件ID使用django社交认证的脸谱和谷歌
- 29. Firebase验证同一用户的多个电子邮件地址
- 30. 验证用户输入的电子邮件地址
嗨。我如何去实现你在上面发布在我的Django应用程序中的解决方案?上面的代码应该去哪里? – 2013-04-04 15:07:36
@ArpitRai如果你有一个相对较新版本的'social-auth',我建议你今天使用Zhe的答案(http://stackoverflow.com/a/16267281/556413) – glarrain 2014-04-21 21:51:23