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
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.
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()
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.
oggi lo farei sicuramente, ma torniamo ai giorni questa era un'altra storia :) I campi protetti non erano ancora stati introdotti. – Bastian
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 :) –
sì! ti ha dato +1 – Bastian
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? –
@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