Рекомендации для начинающих работать с Django Social Auth
Меня часто спрашивают, а я ленюсь отвечать одно и то же. Поэтому хочу здесь дать несколько практических советов тем, кто начинает разбираться с DSA.
1. С чего начать?
Начинайте всегда с примера django-social-auth/example, а в нем — с простых авторизаций вроде OpenId. Потом можно заполнить local_settings и переходить к OAuth, но имейте в виду, что многие из них потребуют запуска на доменном имени вашего сайта, а не на localhost.
2. Не работает!
Когда я делаю merge больших изменений из основной ветки, то всегда проверяю, не сломалась ли авторизация (бывает, что ломается), и только потом выкладываю код на github. Это я как бы намекаю, что проблема, скорее всего, на вашей стороне. Проверьте настройки, URL’ы и импорты.
3. Используется ли в реальных проектах?
Да, в частности на http://conceptor.ru. Собственно, для этого проекта все и разрабатывалось, сайт можно использовать в качестве развернутого примера.
Ответы на: Рекомендации для начинающих работать с Django Social Auth
Александр пишет:
4 ноября, 2011
Привет.Очень крутая штука!
Подскажи, пожалуйста, при авторизации пользователя в Users появляются клоны одного и того же пользователя, равные количеству авторизаций через соц.сети. Проверял для Вконтакте и Фейсбук. Это специально, или я что-то не то делаю?
krvss пишет:
4 ноября, 2011
Есть 2 способа привязки User и SocialAuth: регистрация и ассоциация. Регистрация происходит по умолчанию, и при регистрации будет всегда создаваться новый User, если только не включена проверка на совпадение по e-mail(SOCIAL_AUTH_ASSOCIATE_BY_MAIL). Тогда, если, например, у пользователя 2 ФБ с одинаковым адресом почты, то новый User создаваться не будет. Ассоциация (associate) создается когда пользователь уже авторизован (залогинен) в системе, неважно через какую сеть, и тогда новый SocialAuth будет опять же явно привязан к текущему авторизованному пользователю, вне зависимости от того, какие у него адреса почты и пр, просто жесткое соответствие и все.
То есть: клоны появляются когда пользователь просто в незалогиненном состоянии делает регистрацию через соцсеть, и у нас нет никакого способа понять, что у нас он уже зарегистрирован. Такое всегда будет с ВКонтакте, потому что последний не отдает e-mail, так что проверить не получится.
Проблема клонов есть 🙂 Поэтому мы у себя в проекте делали операции «подключиться к сети» и «отключиться от сети», чтобы пользователь мог явно привязать к одному user несколько разных сетей, или отвязать лишнее. Можешь посмотреть, как это сделано на conceptor.ru
Еще один вариант — всегда требовато e-mail при регистрации, если соцсеть его не отдала. Тоже не фонтан, так как лишний шаг для пользователя, который в общем не виноват.
Александр пишет:
5 ноября, 2011
Подскажи, пожалуйста, возможно ли изменять некоторые параметры авторизации. Например, мне нужно сделать для Вконтакте чтобы работали некоторые scope: redirect_uri=http://api.vk.com/blank.html
krvss пишет:
5 ноября, 2011
Возможно, но мне нужно знать через какой backend ты авторизуешься — OpenAPI или OAuth?
Александр пишет:
5 ноября, 2011
Через OAuth, получилось передать параметры через VKONTAKTE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {‘redirect_uri’: ‘http://api.vk.com/blank.html’, ‘response_type’: ‘token’}
Дальше стоит задача, как оттуда доставать данные и перенаправлять куда нужно
krvss пишет:
6 ноября, 2011
Да, через OAuth они так именно и отправляются.
А зачем нужно редиректить после авторизации на URL на сайте ВК? 🙂
Александр пишет:
13 ноября, 2011
Думал обойти ограничение вКонтакте на программный пост на стену пользователя
Виктор пишет:
13 января, 2012
Вот хотелось бы узнать, как сделать чтоб при клике на иконку провайдера все запросы и подтверждения выполнялись во всплывающем окне. И в случае успешной проверки всплывающее окно просто закрывается, а текущая страница обновляется.
Так сделано у вас на сайте http://conceptor.ru/
Но вот как это сделать, не могу понять
krvss пишет:
13 января, 2012
Вот так сделано:
1. Есть div, застайленный на показ иконки.
2. По клику, в зависимости от провайдера, генерируется URL для прохождения авторизации.
3. Этот URL передается в функцию, которая делает следующее:
Добавляет к нему параметр Next — url, который будет вызван после успешного прохождения авторизации: url += «next={% url social_close %}»;
Вызывает функцию makePopupWindow с этим url — эта функция просто делает popup с указанным url. Теперь все, что делает провайдер будет в этом попапе.
4. Вью social_close проверяет, успешно ли прошла авторизация. Если успешно, то в попапе рендерится специальная страница, которая вызывает window.opener.location.reload(true); — то есть окно, которое вызвало попап, перегружается.
5. Если была ошибка, то рендерится та же страница, которая не перегружает parent, а выводит сообщение об ошибке и закрывает попап.
Можно сделать поэлегантнее, не перегружать всего парента, а вызывать какой-нибудь коллбэк, который будет менять часть страницы. Но если слишком многое меняется, то проще перегрузить.