Tôi đã cài đặt django social-auth (từ omab) và người dùng có địa chỉ email trong cơ sở dữ liệu mà tôi muốn giữ nhưng khi người dùng đăng nhập từ facebook bằng cách sử dụng mạng xã hội-auth, email của họ được thay thế bằng email họ có trong tài khoản facebook của họ. Tôi không chắc chắn các thiết lập là một trong những mặc định hay không và không thể tìm thấy làm thế nào để ngăn chặn hành vi này.Làm thế nào để không thiết lập địa chỉ email của người dùng trong django social-auth
Trả lời
Tôi tìm thấy nó, trong pipeline chịu trách nhiệm cho điều đó là
social_auth.backends.pipeline.user.update_user_details
Tôi chỉ cần loại bỏ nó ra khỏi đường ống và bây giờ các chi tiết như địa chỉ email và tên còn lại cho người sử dụng để điền vào.
Tôi đang đăng giải pháp của mình (cập nhật chi tiết người dùng, không ghi đè chúng) để có thể giúp ai đó. Dựa trên pipeline.user.update_user_details
tôi mã hóa như sau:
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()
Các bạn đã thử SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)
Từ hướng dẫn:
Bộ xử lý update_user_details đường ống sẽ thiết lập các lĩnh vực nhất định trên đối tượng người dùng, chẳng hạn như email. Thiết lập này cho một danh sách các lĩnh vực bạn chỉ muốn thiết lập cho người dùng mới được tạo ra:
SOCIAL_AUTH_PROTECTED_USER_FIELDS = [ 'email',]
Ngoài giá trị thêm hơn sẽ được lưu trữ nếu được xác định. Chi tiết về cài đặt này được liệt kê bên dưới trong phần OpenId và OAuth.
hôm nay tôi chắc chắn sẽ làm điều đó, nhưng trở lại trong những ngày đó là một câu chuyện khác :) Các lĩnh vực được bảo vệ chưa được giới thiệu. – Bastian
Vâng, tôi biết. Tôi đã cố gắng giải quyết nó ngày hôm qua và tôi gần như đã đi cho giải pháp của glarrain. Sau đó, tôi tìm thấy cài đặt này trong hướng dẫn sử dụng. Chỉ cần đặt nó ở đây trong trường hợp một người nào đó TL; DR hướng dẫn sử dụng :) –
yep! đã cho bạn +1 – Bastian
- 1. Làm thế nào để có được địa chỉ email của người dùng twitter với twitter api
- 2. người dùng tra cứu trong ActiveDirectory theo địa chỉ email
- 3. Làm thế nào để thiết lập tên của một người gửi email thông qua PHP
- 4. Nhận ID người dùng Facebook theo địa chỉ email
- 5. Nhận địa chỉ email của người dùng từ tên người dùng qua PowerShell và WMI?
- 6. Địa chỉ email người gửi động Devise
- 7. Làm cách nào để trích xuất tên người dùng từ địa chỉ email bằng javascript?
- 8. Jira gửi email từ địa chỉ người dùng
- 9. Xác minh địa chỉ email là người dùng paypal
- 10. Nhận địa chỉ IP của người dùng
- 11. Nhận địa chỉ email mặc định của người dùng trong Cocoa
- 12. Nhận địa chỉ email của người dùng hiện tại trong Outlook 2007
- 13. Làm thế nào để Thiết lập tên người dùng và mật khẩu của phpmyadmin
- 14. trim @ domain.xxx từ email chỉ để lại tên người dùng
- 15. Set email như tên người dùng trong Django 1,5
- 16. Làm cách nào để lấy địa chỉ email
- 17. cho phép mọi người tra cứu người dùng theo địa chỉ email của nó! làm thế nào để ngăn chặn điều này?
- 18. Làm thế nào để thiết lập Java để sử dụng chứng chỉ người dùng cụ thể cho Eclipse?
- 19. Làm thế nào để tìm địa chỉ vật lý của một biến từ không gian người dùng trong Linux?
- 20. Làm thế nào để thiết lập Devise tên người gửi cho email?
- 21. Nhận địa chỉ email của tác giả trong SVN
- 22. Tôi nên quản lý địa chỉ email của người dùng TFS ở đâu?
- 23. Làm thế nào để thiết lập địa chỉ IP từ C trong linux
- 24. làm thế nào để thiết lập tên người dùng/mật khẩu trong httpget
- 25. Làm cách nào để gửi email đến 10.000 người dùng ở Django?
- 26. Phím Gitosis và ssh - địa chỉ email có liên quan đến địa chỉ email git không?
- 27. Phương pháp đúng để tìm kiếm người dùng AD theo địa chỉ email từ .NET
- 28. Làm thế nào để thiết lập Django/Apache cho môi trường dev của nhà thiết kế
- 29. Làm cách nào để nhận dữ liệu email liên hệ của người dùng từ Windows Live?
- 30. Thiết lập - tạo tài khoản người dùng có xác nhận mà không cần gửi email?
Xin chào. Làm thế nào chính xác để tôi đi về việc thực hiện các giải pháp bạn đã đăng ở trên trong ứng dụng Django của tôi? Trường hợp chính xác nên đoạn mã trên đi đâu? –
@ArpitRai Nếu bạn có một phiên bản tương đối mới của 'social-auth' tôi đề nghị bạn sử dụng câu trả lời của Zhe (http://stackoverflow.com/a/16267281/556413) – glarrain