2012-03-26 12 views
9

Ho installato django social-auth (da omab) e gli utenti hanno un indirizzo email nel database che è quello che voglio mantenere ma quando gli utenti accedono da Facebook utilizzando social-auth, la loro e-mail viene sostituita da quella che hanno nel proprio account Facebook. Non sono sicuro che le impostazioni siano quelle predefinite o meno e non riescano a trovare come fermare questo comportamento.Come non impostare l'indirizzo email dell'utente in django social-auth

risposta

5

ho trovato, nel pipeline il responsabile di questo è

social_auth.backends.pipeline.user.update_user_details 

ho appena rimosso dalla tubazione e ora i dettagli come indirizzo e-mail e il nome sono a sinistra per l'utente a riempire.

3

Sto postando la mia soluzione (aggiornare i dettagli dell'utente, non sovrascriverli) in modo che possa aiutare qualcuno. Sulla base di pipeline.user.update_user_details ho codificato il seguente:

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

Ciao. Come faccio esattamente a implementare la soluzione che hai postato sopra nella mia applicazione Django? Dove dovrebbe andare esattamente il codice di cui sopra? –

+0

@ArpitRai Se si dispone di una versione relativamente nuova di 'social-auth', si consiglia di utilizzare la risposta di Zhe (http://stackoverflow.com/a/16267281/556413) – glarrain

9

Hai provato SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)

Dal manuale:

Il processore update_user_details gasdotto impostare alcuni campi oggetti utente, come la posta elettronica. Impostare questo a un elenco di campi che solo desidera impostare per gli utenti appena creati:

SOCIAL_AUTH_PROTECTED_USER_FIELDS = [ 'email',]

anche valori più extra verranno memorizzati se definito. I dettagli su questa impostazione sono elencati di seguito nelle sezioni OpenId e OAuth.

+0

oggi lo farei sicuramente, ma torniamo ai giorni questa era un'altra storia :) I campi protetti non erano ancora stati introdotti. – Bastian

+0

Sì, lo so. Ho cercato di risolverlo ieri e sono quasi andato alla soluzione di glarrain. Poi ho trovato queste impostazioni nel manuale. Mettilo qui nel caso qualcuno TL, DR il manuale :) –

+0

sì! ti ha dato +1 – Bastian