django-ulogin icon indicating copy to clipboard operation
django-ulogin copied to clipboard

Уникальная почта пользователя

Open DrMartiner opened this issue 12 years ago • 9 comments

Доброго времени суток!

Сделайте, пожалуйста, уникальную почту пользователя: если такая почта уже есть, то при регистрации пользователь с такой же почтой не регистрируется, а авторизуется как существующий.

PS: это самое адекватное джанго-приложение для авторизации через соц. сети

DrMartiner avatar Jul 23 '12 04:07 DrMartiner

Доброго,

Спасибо за тёплые отзывы, но я Вас, пожалуй, разочарую: эта задумка не очень ложится в идеологию работы django-ulogin. Всё-таки email - это точно такое же поле, как и first_name, например, поэтому оно оказаться быть неуникальным в рамках одной соц. сети (например, у разных жж-юзеров допускается один email).

К тому же, в каком-нибудь проекте e-mail вообще может не быть нужным, поэтому хардкодить дополнительные проверки, обрекая тем самым юзера на ввод ненужного в общем-то имейла - тоже идея так себе.

А вот idenity гарантирует уникальность.

Думаю, в Вашем случае лучше либо форкнуть django-ulogin, либо написать собственное приложение django_ulogin_email, которое подключалось бы к проекту и расширяло оригинальный django-ulogin. Навскидку, это новое приложение должно работать как-то так:

  • Модель ULoginEmail с полем email и внешним ключом на django_ulogin.ULoginUser;
  • Вьюшка EmailPostBackView, унаследованная от django_ulogin.views.PostBackView, в которой перекрыты методы handle_authenticated_user и handle_anonymous_user (это они отвечают за создание учёток);
  • В urls.py подключить эту вьюху раньше оригинальной, чтобы запросы обрабатывала она.

В общем, частный случай вполне решаем, как мне кажется :-)

marazmiki avatar Jul 23 '12 05:07 marazmiki

Да, случай частный. Только сейчас подумал о том, что в случае Твиттера и Вконтакта пользователь указывает произвольную почту, никак не подтверждённую соц. сетью. У меня авторизация по почте и паролю. Если 2 одинаковые почты, то будет падает с ошибкой: "get() returned more than one User -- it returned 2! Lookup parameters were {'email': u'[email protected]'}"

Сказать пользователю о том, что такая почта уже есть в случае Твиттера и ВК нет, т. к. её спрашивают на стороне uLogin.

Как бы вы решили задачу с уникальной почтой?

DrMartiner avatar Jul 23 '12 05:07 DrMartiner

Кстати, может быть, сделать опцию ULOGIN_UNIQUE_EMAIL (default=False):

if ULOGIN_UNIQUE_EMAIL:
  user, created = User.objects.get_or_create(email=email)
else:
  user = User(email=..., is_active=True, ...)

DrMartiner avatar Jul 23 '12 05:07 DrMartiner

Как бы вы решили задачу с уникальной почтой?

Запретил бы пользоваться email в качестве логина :-) По-другому, кажется, никак в свете вышеозначенного. В общем-то, ulogin для того и придумывали, чтобы уйти от стандартной схемы "логин-пароль".

Да и вообще, поле email в auth.User неуникально и даже, кажется, на нём нет индексов. Использовать его как логин определённо не стоит. Если непременно надо аутентифицироваться по имейлу, лучше его писать в username. Он хотя бы уникальный и индексируемый.

Кстати, может быть, сделать опцию ULOGIN_UNIQUE_EMAIL (default=False):

Лучше не надо. Нехорошо общие решения подстраивать под частные.

marazmiki avatar Jul 23 '12 05:07 marazmiki

В том-то и дело, что не можем отказаться от авторизации по почте. Лано, чтонить придумаю :)

Отличный сервис! Отличное приложение!

DrMartiner avatar Jul 23 '12 09:07 DrMartiner

Здравствуйте! Есть какие-то подвижки в этом направлении? Приложение отличное, но тоже встала проблема с использованием e-mail в роли username. Можно ли "вклиниться" в процесс авторизации на стадии, когда django-ulogin создаёт нового пользователя в системе? Чтобы использовать свою логику (в данном случае проверить поле e-mail от ulogin и username, в случае совпадения передать id этого пользователя, иначе - создать). Этот сигнал будет очень полезен для реализации подобных задач.

stelzzz avatar Dec 17 '12 20:12 stelzzz

Доброго дня,

Я по-прежнему уверен, что использовать e-mail как идентификатор вредно. Поэтому никаких подвижек в этом направлении нет и не планируется.

С другой стороны, это приложение разрабатывалась во времена Django 1.3х и, соответственно, под стандартного User. В Django 1.5, как Вы, возможно, знаете, появилась штатная возможность использовать собственную модель вместо auth.User. В ней поля могут быть какими угодно и называться как угодно.

Вот в этом направлении двигаться стоит, правда, я пока не очень представляю как. Возможно, решение косвенным образом позволит решить и Ваши проблемы. Но лучше бы Вам всё же отказаться от мысли использовать e-mail как идентификато - коллизии возможны.

marazmiki avatar Dec 18 '12 04:12 marazmiki

Согласен, вредно и не безопасно. Поэтому и нужны какие-то точки в системе, которые можно было бы переопределять. Например тут https://github.com/marazmiki/django-ulogin/blob/master/django_ulogin/views.py#L82 было бы удобно задавать свою логику: К примеру для google, yandex, mailru создавать логин(или проверять существует ли пользователь) на базе email (у этих провайдеров он будет подтвержденным и уникальным), для vkontakte и других - создавать на какой-то другой базе.

Так приложение будет более гибким.

stelzzz avatar Dec 18 '12 09:12 stelzzz

Приложение тем гибче, чем проще. Читайте - чем в нём меньше ветвлений и условностей =)

Лучше предоставить программисту возможность самому работать с сохраняемым объектом (а это сделать всё равно придётся в реалиях Django 1.5). Как он напишет, так и будет.

marazmiki avatar Dec 18 '12 14:12 marazmiki