2012-03-26 1 views
9

Ich habe django social-auth installiert (aus omab) und die Benutzer haben eine E-Mail-Adresse in der Datenbank, die ich behalten möchte, aber wenn sich die Benutzer anmelden von facebook mit social-auth wird ihre e-mail durch diejenige ersetzt, die sie in ihrem facebook account haben. Ich bin mir nicht sicher, ob die Einstellungen die Standardeinstellung sind oder nicht und kann nicht finden, wie man dieses Verhalten stoppt.Wie man die E-Mail-Adresse des Benutzers nicht in django social-auth setzt

Antwort

5

Ich fand es in den pipeline die verantwortlich dafür ist

social_auth.backends.pipeline.user.update_user_details 

ich es aus der Pipeline nur entfernt und nun die Details wie E-Mail-Adresse und Name werden den Benutzer zu füllen.

3

Ich poste meine Lösung (Benutzerdetails aktualisieren, nicht überschreiben), so kann es jemand helfen. Basierend auf pipeline.user.update_user_details codiert ich folgendes:

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

Hallo. Wie genau gehe ich bei der Implementierung der oben beschriebenen Lösung in meiner Django-Anwendung vor? Wo genau sollte das obige Stück Code gehen? –

+0

@ArpitRai Wenn Sie eine relativ neue Version von 'social-auth' haben, empfehle ich Ihnen Zhe's Antwort (http://stackoverflow.com/a/16267281/556413) – glarrain

9

Haben Sie SOCIAL_AUTH_PROTECTED_USER_FIELDS versucht? :)

Aus dem Handbuch:

Der update_user_details Pipeline-Prozessor bestimmte Felder auf Benutzerobjekte festgelegt werden, wie E-Mail. Setzen Sie diese auf einer Liste von Feldern, die Sie nur wollen für neu erstellte Benutzer eingestellt werden:

SOCIAL_AUTH_PROTECTED_USER_FIELDS = [ ‚E-Mail‘,]

auch zusätzliche Werte werden gespeichert, wenn definiert. Details zu dieser Einstellung sind unten in den Abschnitten OpenId und OAuth aufgeführt.

+0

heute würde ich definitiv tun, aber zurück in den Tagen das war eine andere Geschichte :) Geschützte Felder wurde noch nicht eingeführt. – Bastian

+0

Ja, ich weiß. Ich habe gestern versucht, es zu lösen, und ich ging fast für Glarrains Lösung. Dann habe ich diese Einstellungen im Handbuch gefunden. Setzen Sie es hier, falls jemand TL, DR das Handbuch :) –

+0

yep! gab dir +1 – Bastian