Django, и авторизация через социальные сети (django-social-auth)?
Пишу небольшой развлекательный сайт на Django. Когда дошло дело до создания странички регистрации первое что пришло в голову:«Все сейчас делают авторизацию через социальные сети, ну а я чем хуже?». Скачал django-social-auth, начал пробовать. Увы как это часто со мной бывает — сначала делаю, а уже потом думаю. Настроил авторизацию через Vkontakte, порадовался, а затем задумался как же всё это работает… Ну вот предположим на сайте настроена авторизация через vkontakte и twitter. Таким образом если я попытаюсь авторизироваться через каждый сервис — будет создано 2 разных аккаунта, что как-то бредово. Нет, конечно можно поспорить с тем что зачем авторизироваться через разные социалки, если можно всегда только через одну, но… А что если пользователь скажем выпилит свою страничку из VK? Получается зайти под своим аккаунтом на мой сайт больше не сможет? Конечно пользователь из базы моего сайта при удалении страницы в VK никуда не денется, но и войти без пароля не возможно.
Далее насколько я понял (а почти нулевые знания англ. меня сильно подводят) этот вопрос можно решить через механизм ассоциаций, скажем привязав все аккаунты из социалок пользователя к единому email, верно? Но тогда мы сталкиваемся с другой проблемой, ведь как я понял к примеру VK и Twitter не дают email-а пользователя, заставлять вводить в отдельной форме? Но чем тогда такая авторизация отличается от обычной регистрации логин / пароль / email?
В общем если есть люди которые разбирались — подскажите, я верно мыслю, или в чем-то ошибаюсь?
Можно реализовать решение на базе двух таблиц.
Users — пользователи
Login — аккаунты в соц. сетях.
В таблице Login есть связь с таблицей Users.
Если пользователь авторизовался на сайте, то вход через другую соц. сеть может привязывать новый Login к существующей учетной записи (например, она создана при первом входе через другую соц. сеть или при регистрации).
По сути всё так и происходит, но как определить к какому из аккаунту из первой таблицы привязываться? Ведь никаких общих данных по которым можно было бы сделать поиск нет.
При создании новой записи Login создается новая запись в Users, если пользователь в текущий момент не авторизован.
Если авторизован, то для новой записи Login пользователь уже известен.
Ну да, вариант, но какой пользователь будет авторизироваться повторно в других социалках, если авторизация уже пройдена… Если только страничку показать типа если есть ещё аккаунты в других сетях — авторизируйтесь сейчас, будем их привязывать, чтобы потом в случае потери основного — не было мучительно больно.
Мыслите правильно, но особо приличного и универсального решения как бы и нет, по причинам озвученным вами же — сложность сопоставления аккаунтов в разных соцсетях. А если упростить, то, очевидно, возникнет проблема безопасности.
Мне кажется что приличного решения и нет, как сопоставлять аккаунты? Как вариант, можно после регистрации ненавязчиво спрашивать e-mail. Укажет — хорошо, не укажет — ну и ладно.
я например пользуюсь ulogin.ru, поэтому мэил всегда возвращается, и можно сделать проверку, есть ли он в бд или нет.
а плодить аккаунты на сайте имхо глупо
Если для сайта почта нужна, то нужно, так или иначе, сделать запрос почтового ящика у пользователя. И при этом нужно проверить что эта почта дествительно принадлежит этому пользователю. Соотвественно, можно предложить такое решение:
При регистрации через ненадежные сервисы всегда спрашивать почту. И после регистрации выполнять процедуру проверки отправив письмо со ссылкой на активацию. Активация нужна не для активации логина, а для удостоверения в том что почта не левая. Если пользователь не желает ее подтверждать — это его личная проблема.
При этом нужно учитывать что делать привязку новой соц. (ненадежной) сети к старому аккаунту по тихому тоже нельзя, и здесь тоже нужно подтвержение того что старый аккаунт дествительно принадлежит тому же человеку что и емайл указанный в старом.