2016-11-16 12 views
0

На мой сайт можно войти через:Python Social Auth дублирования сообщений электронной почты для различных пользователей

  • имя пользователя и пароль
  • электронной почты и пароль
  • Google AUTH 2
  • фейсбук

Где я использую пользовательский пользовательский интерфейс django и социальный аудит python.

Проблема:

Предположим, я создаю следующий счет:

Имя пользователя: losimonassi электронной почты: [email protected]

Тогда, когда я пытаюсь войти с моим Gmail (lorenzosimonassi @ gmail.com) python social auth создает другого пользователя с тем же адресом электронной почты. Поэтому, когда я пытаюсь войти в систему с помощью своего электронного письма, система auth обнаруживает два похожих сообщения электронной почты, которые вызывают ошибку.

Я пытаюсь найти способ, когда пользователь пытается войти в систему с помощью gmail, его электронная почта проверяется на БД, и если она уже существует, процесс останавливается перенаправлением и предупреждением (я думаю, это могло бы выполняться через промежуточное ПО).

Но, конечно, проверка на БД должна проверяться только на других пользователей и обычных пользователей, чтобы не блокировать его собственный логин.

Я не хочу связывать счета.

settings.py

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.user.create_user', 
    #'social.pipeline.social_auth.associate_user', 
    #'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details' 
) 

admin image

ответ

0

Я сталкивался описываемую ситуацию. Путь я решил это: добавить пользовательский шаг к трубопроводу социальной идентификации:

def check_email_exists(backend, details, uid, user=None, *args, **kwargs): 
    email = details.get('email', '') 
    provider = backend.name 

    # check if social user exists to allow logging in (not sure if this is necessary) 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    # check if given email is in use 
    count = User.objects.filter(username=email).count() 

    # user is not logged in, social profile with given uid doesn't exist 
    # and email is in use 
    if not user and not social and count: 
     raise AuthException(backend) 

Добавить ваш вызываемым к трубопроводу:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'path.to.module.check_email_exists', # move if appropriate 
    'social.pipeline.user.create_user', 
    'social.pipeline.user.user_details' 
) 

Повышение AuthException будет перенаправлять пользователя в settings.SOCIAL_AUTH_LOGIN_ERROR_URL. Однако, если это не то, что вы хотите, есть и другой подход. Проверка Python-social-auth возвращает значение любой части вашего конвейера. Если возвращаемое значение равно None, оно просто продолжается. Если это dict, он обновит kwargs, используя этот словарь, чтобы значения были доступны позже в конвейере. Однако, если возвращаемое значение равно HttpResponse, скажем, HttpResponseRedirect, оно вернет ответ пользователю. Таким образом, вместо того, приподнимая AuthException, вы можете сделать

return HttpResponseRedirect(reverse('desired-endpoint')) 

Однако, не считать, что с зерном соли: Документы не заявить это ясно, и я сделал это некоторое время назад, так что я мог бы ошибаться.

+0

Спасибо! Я сделал небольшие изменения, он отлично работает! –

0

Вы можете связать пользователей по своим адресам электронной почты, добавив встроенный, но по умолчанию не активный шаг в конвейере. Обратите внимание, что вы должны сделать это, только если вы уверены, что социальный провайдер проверяет адреса электронной почты. В противном случае я мог бы зарегистрироваться социальному провайдеру, используя вашу электронную почту, зайти на ваш сайт и получить доступ к вашему пользователю на вашем сайте.

Python социальной аутентификации документов и как связать пользователя по электронной почте: https://python-social-auth-docs.readthedocs.io/en/latest/use_cases.html?highlight=associate%20user#associate-users-by-email

Из приведенной выше ссылке:

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details', 
    'social_core.pipeline.social_auth.social_uid', 
    'social_core.pipeline.social_auth.auth_allowed', 
    'social_core.pipeline.social_auth.social_user', 
    'social_core.pipeline.user.get_username', 
    'social_core.pipeline.social_auth.associate_by_email', # <--- enable this one 
    'social_core.pipeline.user.create_user', 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
)