У меня установлена социальная аутентификация django (от omab), и у пользователей есть адрес электронной почты в базе данных, который я хочу сохранить, но когда пользователи входят в систему из facebook с помощью социальной аутентификации, их адрес электронной почты заменяется на тот, который у них есть в их аккаунте в фейсбуке. Я не уверен, что настройки установлены по умолчанию или нет, и не могу найти, как остановить такое поведение.
Как не устанавливать адрес электронной почты пользователя в django social-auth
Ответы (3)
Вы пробовали SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)
Из руководства:
Обработчик конвейера update_user_details установит определенные поля в пользовательских объектах, таких как электронная почта. Установите это в список полей, которые вы хотите установить только для вновь созданных пользователей:
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['электронная почта',]
Также будет сохранено больше дополнительных значений, если они определены. Подробная информация об этом параметре приведена ниже в разделах OpenId и OAuth.
Я нашел это, в конвейере ответственным за это является
social_auth.backends.pipeline.user.update_user_details
Я просто удалил его из конвейера, и теперь такие детали, как адрес электронной почты и имя, оставлены пользователю для заполнения.
Я публикую свое решение (обновите данные пользователя, а не перезаписывайте их), так что это может кому-то помочь. На основе 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()
social-auth
, я рекомендую вам использовать ответ Чжэ (stackoverflow.com/a/16267281/556413)
- person glarrain; 22.04.2014