2012-03-26 12 views
9

में उपयोगकर्ता का ईमेल पता कैसे सेट करें I django social-auth इंस्टॉल किया गया है (ओमाब से) और उपयोगकर्ताओं के पास डेटाबेस में एक ईमेल पता है जिसे मैं रखना चाहता हूं लेकिन जब उपयोगकर्ता लॉग इन करते हैं फेसबुक से सोशल-ऑथ का उपयोग करके, उनके ईमेल को उनके फेसबुक अकाउंट में बदल दिया जाता है। मुझे यकीन नहीं है कि सेटिंग डिफ़ॉल्ट रूप से एक हैं या नहीं और यह नहीं मिल सकती कि इस व्यवहार को कैसे रोकें।django social-auth

उत्तर

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

हाय। मैं अपने Django आवेदन में ऊपर दिए गए समाधान को लागू करने के बारे में वास्तव में कैसे जा सकता हूं? कोड के उपरोक्त टुकड़े कहां जाना चाहिए? –

+0

@ArpitRai यदि आपके पास 'सोशल-ऑथ' का अपेक्षाकृत नया संस्करण है, तो मैंने आपको Zhe के उत्तर (http://stackoverflow.com/a/16267281/556413) – glarrain

9

आप SOCIAL_AUTH_PROTECTED_USER_FIELDS की कोशिश की? :)

मैनुअल से:

update_user_details पाइपलाइन प्रोसेसर जैसे ईमेल उपयोगकर्ता वस्तुओं पर कुछ क्षेत्रों, सेट हो जाएगा। आप केवल नव निर्मित उपयोगकर्ताओं के लिए सेट करना चाहते हैं क्षेत्रों की एक सूची के लिए सेट:

SOCIAL_AUTH_PROTECTED_USER_FIELDS = [ 'ईमेल',]

भी अधिक अतिरिक्त मूल्यों अगर संग्रहीत किया जाएगा परिभाषित। इस सेटिंग के बारे में विवरण OpenId और OAuth अनुभागों में नीचे सूचीबद्ध हैं।

+0

का उपयोग करने का पुन: उपयोग किया, आज मैं निश्चित रूप से ऐसा करूँगा, लेकिन दिनों में वापस वह एक और कहानी थी :) संरक्षित खेतों को अभी तक पेश नहीं किया गया था। – Bastian

+0

हाँ, मुझे पता है। मैं कल इसे हल करने की कोशिश कर रहा था और मैं लगभग ग्लैरेन के समाधान के लिए गया था। तब मुझे मैन्युअल में यह सेटिंग्स मिलीं। बस इसे किसी टीएल के मामले में यहां रखें; मैनुअल मैन करें :) –

+0

हाँ! आपको +1 दिया – Bastian