2012-03-26 27 views
9

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

5

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.

3

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() 
+0

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? –

+0

@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

9

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.

+0

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

+0

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 :) –

+0

yep! đã cho bạn +1 – Bastian

Các vấn đề liên quan