Как не устанавливать адрес электронной почты пользователя в django social-auth

У меня установлена ​​социальная аутентификация django (от omab), и у пользователей есть адрес электронной почты в базе данных, который я хочу сохранить, но когда пользователи входят в систему из facebook с помощью социальной аутентификации, их адрес электронной почты заменяется на тот, который у них есть в их аккаунте в фейсбуке. Я не уверен, что настройки установлены по умолчанию или нет, и не могу найти, как остановить такое поведение.


person Bastian    schedule 26.03.2012    source источник


Ответы (3)


Вы пробовали SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)

Из руководства:

Обработчик конвейера update_user_details установит определенные поля в пользовательских объектах, таких как электронная почта. Установите это в список полей, которые вы хотите установить только для вновь созданных пользователей:

SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['электронная почта',]

Также будет сохранено больше дополнительных значений, если они определены. Подробная информация об этом параметре приведена ниже в разделах OpenId и OAuth.

person Zhe Li    schedule 28.04.2013
comment
сегодня я бы определенно это сделал, но тогда это была другая история :) Защищенные поля еще не были введены. - person Bastian; 29.04.2013
comment
Да, знаю. Я пытался решить это вчера, и я почти пошел на решение glarrain. Затем я нашел эти настройки в руководстве. Просто поместите его сюда на случай, если кто-то TL; DR руководство :) - person Zhe Li; 29.04.2013

Я нашел это, в конвейере ответственным за это является

social_auth.backends.pipeline.user.update_user_details

Я просто удалил его из конвейера, и теперь такие детали, как адрес электронной почты и имя, оставлены пользователю для заполнения.

person Bastian    schedule 27.03.2012

Я публикую свое решение (обновите данные пользователя, а не перезаписывайте их), так что это может кому-то помочь. На основе 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()
person glarrain    schedule 01.06.2012
comment
Привет. Как именно мне реализовать решение, которое вы разместили выше, в моем приложении Django? Куда именно должен идти приведенный выше фрагмент кода? - person Arpit Rai; 04.04.2013
comment
@ArpitRai Если у вас относительно новая версия social-auth, я рекомендую вам использовать ответ Чжэ (stackoverflow.com/a/16267281/556413) - person glarrain; 22.04.2014