Django. Авторизация через социальные сети с помощью django-social-auth
Авторизация на сайтах через социальные сети очень удобна, не надо заполнять регистрационные формы и т.д., вам достаточно нажать на соответствующую кнопку и вас авторизует сам сайт, при этом нужные данные он сможет получить с сайта источника (той социальной сети, с которой выполняется авторизация).
На своих проектах я использую клёвую библиотеку django-social-auth, до неё пробовал django-ulogin, но сам сервис uLogin мне не понравился (мои сумбурные заметки об этом). На пыхе также обсуждали другие библиотеки, в частности loginza, но отзывы о ней плохие, поэтому даже не пробовал. В любом случае сервисы - это сервисы, и зависимость от сервисов это больше проблема (частые падения сервисов, убогие виджеты и внешний вид без кастомизаций и т.п.) чем зависимость от библиотеки, которая проксирует запросы к конечным "социальным сетям".
И второй, со свежой поддержкой русских социалок от krvss, в который я пулял фиксы.
Регистрации в сетях
Для начала нам надо получить ключи от необходимых социальных сетей, на странице проекта в GitHub есть инструкции для множества социальных сетей, но в свое время у меня были трудности и я решил записать последовательность действий для некоторых из них.
Facebook
Зайдите на https://developers.facebook.com/apps/ и нажмите на + Create New App. Введите название приложения (название сайта или проекта), после сабмита формы вы увидите реквизиты "App ID" и "App Secret".
Теперь заполните поле "App Domains", укажите через пробел домены (например один локальный, другой продакшен домен). Поставьте галочку на "Website with Facebook Login" и введите адрес для редиректа, я редиректю в корень продакшен сайта.
Twitter
Зайдите на https://dev.twitter.com/ и введите логин и пароль от вашей учетной записи в Twitter. Далее заходите на https://dev.twitter.com/apps и жмёте на Create a new application, заполните нужные поля и соглашаетесь с правилами, после чего вы получите "Consumer key" и "Consumer secret".
По умолчанию вам выдадут Access level "Read-only", для авторизации этого вам хватит. Рекомендую прочитать The Application Permission Model.
Вконтакте
Зайдите на страницу http://vk.com/developers.php и нажмите Создать приложение, выберите Тип "Веб-сайт" и введите адрес сайта и имя домена. В ответ получите "ID приложения" и "Защищенный ключ".
Зайдите на страницу https://code.google.com/apis/console/ , нажмите Create, введите требуемые данные и во вкладке API Access увидите "Client ID" и "Client secret".
Зайдите на страницу https://github.com/settings/applications/new и введите логин и пароль от вашей учетной записи в GitHub. Введите имя приложения, адреса сайта для "URL" и "Callback URL" (у меня это один адрес корневой страницы сайта). И получите "Client ID" и "Client Secret", после чего добавьте их в settings.py:
# Добавляем в AUTHENTICATION_BACKENDS нужные бекенды,
# смотрите полный список https://github.com/omab/django-social-auth/blob/master/doc/configuration.rst
AUTHENTICATION_BACKENDS = (
'social_auth.backends.twitter.TwitterBackend',
'social_auth.backends.facebook.FacebookBackend',
'social_auth.backends.contrib.vk.VKOAuth2Backend',
'social_auth.backends.google.GoogleOAuth2Backend',
'social_auth.backends.contrib.github.GithubBackend',
'django.contrib.auth.backends.ModelBackend',
)
# Добавляем в TEMPLATE_CONTEXT_PROCESSORS процессор "social_auth_by_name_backends"
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.request',
'social_auth.context_processors.social_auth_by_name_backends',
)
# И добавляем "social_auth" в INSTALLED_APPS
INSTALLED_APPS = (
...
'social_auth',
)
Дополнительные настройки social_auth, добавьте в settings.py:
import random
# Если имя не удалось получить, то можно его сгенерировать
SOCIAL_AUTH_DEFAULT_USERNAME = lambda: random.choice(['Darth_Vader', 'Obi-Wan_Kenobi', 'R2-D2', 'C-3PO', 'Yoda'])
# Разрешаем создавать пользователей через social_auth
SOCIAL_AUTH_CREATE_USERS = True
# Перечислим pipeline, которые последовательно буду обрабатывать респонс
SOCIAL_AUTH_PIPELINE = (
# Получает по backend и uid инстансы social_user и user
'social_auth.backends.pipeline.social.social_auth_user',
# Получает по user.email инстанс пользователя и заменяет собой тот, который получили выше.
# Кстати, email выдает только Facebook и GitHub, а Vkontakte и Twitter не выдают
'social_auth.backends.pipeline.associate.associate_by_email',
# Пытается собрать правильный username, на основе уже имеющихся данных
'social_auth.backends.pipeline.user.get_username',
# Создает нового пользователя, если такого еще нет
'social_auth.backends.pipeline.user.create_user',
# Пытается связать аккаунты
'social_auth.backends.pipeline.social.associate_user',
# Получает и обновляет social_user.extra_data
'social_auth.backends.pipeline.social.load_extra_data',
# Обновляет инстанс user дополнительными данными с бекенда
'social_auth.backends.pipeline.user.update_user_details'
)
В статье Django Social Auth: now with images имеется пример как через сигналы обновлять аватарку пользователю, на мой вгляд, код служит только для примера.
На uLogin'е есть не слишком приятная особенность.
Я могу на самом улогине в своём профиле указать дефолтные параметры, в том числе мыло. И нихрена не проверяется. Могу, например, твоё указать.
При авторизации же через фейсбук, я могу выбрать какие параметры я желаю пересылать. Например, отключить мыло. Тогда отключённые параметры будут браться из профиля на ulogin'е. И никак не проверить откуда пришло мыло, с фейсбука или с улогина.
В итоге авторизуюсь на фейсбуке под своими данными, а бэкенду приходит, что я под твоими мылом зашёл.
uLogin всё сильнее расстраивает... то у него в качестве пола от вконтакта "1" - это female, а от facebook "1" - male.
Дата дня рождения в убогом виде, строка "1.2.1970"
Через раз 500-я ошибка
Но самое убогое, пытался авторизоваться через ЖЖ, в качестве имени пользователя он вернул "Мастерская", а в качестве фамилии "интернет-разработчика", а никнейм вообще убил "asanov"
По поводу
Здесь с этим всё ок?
Да, с этим тут все окей, вообще никаких нареканий у меня! Текущие проблемы можно тут посмотреть https://github.com/omab/django-social-auth/issues и если что пофиксить самому. Я например вконтакте-бекенд фиксил когда-то. А вот как фиксить сторонний сервис (тот же uLogin) - хз, скорее всего, после подачи реквеста в саппорт - будут тянуть время.
Смотрите также https://github.com/omab/python-social-auth, от автора django-social-auth, вообщем это тоже самое, но без Django. То есть можно использовать где угодно. Сам я еще не пользовался, но при необходимости воспользуюсь
adw0rd, как обстоят дела со совместимостью с django 1.5.1? Если все нормально, то возникали трудности со взаимодействием с кастомной моделью пользователя?
Как избавиться от 500 ошибки? Авторизация проходит успешно (через вк). Но на странице предоставления прав приложения можно нажать "Разрешить" или "Отмена". При нажатии на "Отмена" вылетает AuthCanceled (http://django-social-auth.readthedocs.org/en/v0.7.22/configuration.html#exceptions). Почитал тут (https://github.com/omab/django-social-auth/issues/302#issuecomment-4880887), то есть надо дебаг false и
Django 1.5.1, django-social-auth 0.7.22, VKontakteOAuth2Backend и FacebookBackend не перенаправляют на сайт после подтверждения прав (остается на странице подтверждения). Что делать?
adw0rd, как обстоят дела со совместимостью с django 1.5.1? Если все нормально, то возникали трудности со взаимодействием с кастомной моделью пользователя?
У меня на 1.5.1 все хорошо, при этом кастомный юзер и т.д.
то есть на странице бекенда? Тогда не знаю, смотрите настройки своих приложений в этих социалках, наверное что-то неправильно настроили, напримр адрес коллбек-страницы
то есть на странице бекенда? Тогда не знаю, смотрите настройки своих приложений в этих социалках, наверное что-то неправильно настроили, напримр адрес коллбек-страницы
adw0rd, а не могли бы вы скинуть готовый настроенный проект с БД SQLite, что бы можно было запустить и посмотреть на работу? Был бы вам очень благодарен.
К сожалению у меня не будет на это времени :-(
Вы лучше сами это сделайте и скажите что у вас не получается, и кстати в новом django-social-auth нет бекенда "VKontakteOAuth2Backend", теперь там "social_auth.backends.contrib.vk.VKOAuth2Backend".
Я про это вам уже и сказал. Обычно делается pipeline, который добавляется в SOCIAL_AUTH_PIPELINE и тот код будет подгружать фоточки.
VK_DEFAULT_DATA как и VK_EXTRA_DATA запросят если надо доп. прав и всунут в объект info.get('response') доп. данные, для разной сети они разные, могут быть такими: pic_big, userpic, user_photo и т.п.
Комментарии
На uLogin'е есть не слишком приятная особенность.
Я могу на самом улогине в своём профиле указать дефолтные параметры, в том числе мыло. И нихрена не проверяется. Могу, например, твоё указать.
При авторизации же через фейсбук, я могу выбрать какие параметры я желаю пересылать. Например, отключить мыло. Тогда отключённые параметры будут браться из профиля на ulogin'е. И никак не проверить откуда пришло мыло, с фейсбука или с улогина.
В итоге авторизуюсь на фейсбуке под своими данными, а бэкенду приходит, что я под твоими мылом зашёл.
Здесь с этим всё ок?
Да, uLogin откровенное гавно.
По поводу
Да, с этим тут все окей, вообще никаких нареканий у меня! Текущие проблемы можно тут посмотреть https://github.com/omab/django-social-auth/issues и если что пофиксить самому. Я например вконтакте-бекенд фиксил когда-то. А вот как фиксить сторонний сервис (тот же uLogin) - хз, скорее всего, после подачи реквеста в саппорт - будут тянуть время.
оповещения о камментах на мыло у тебя не предусмотренно?
Не предусмотрено, но я об этом думаю
Смотрите также https://github.com/omab/python-social-auth, от автора django-social-auth, вообщем это тоже самое, но без Django. То есть можно использовать где угодно. Сам я еще не пользовался, но при необходимости воспользуюсь
Запятые лезут в ссылки.
Fixed, надо пофикисть будет еще парсер...
Сделал как у вас написано, не получается что-то, хотя пару минут работало. http://stackoverflow.com/questions/15747567/django-social-auth-dont-log-in
Я смотрю вы уже решили свой вопрос
adw0rd, как обстоят дела со совместимостью с django 1.5.1? Если все нормально, то возникали трудности со взаимодействием с кастомной моделью пользователя?
Как раз сегодня планировал это проверить на проекте py3.3.1 + dj1.5.1
Как избавиться от 500 ошибки? Авторизация проходит успешно (через вк). Но на странице предоставления прав приложения можно нажать "Разрешить" или "Отмена". При нажатии на "Отмена" вылетает AuthCanceled (http://django-social-auth.readthedocs.org/en/v0.7.22/configuration.html#exceptions). Почитал тут (https://github.com/omab/django-social-auth/issues/302#issuecomment-4880887), то есть надо дебаг false и
Но все равно вылетает 500я. Как это можно зафиксить?
Django 1.5.1, django-social-auth 0.7.22, VKontakteOAuth2Backend и FacebookBackend не перенаправляют на сайт после подтверждения прав (остается на странице подтверждения). Что делать?
tim, посмотрите http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
и в исходниках social_auth/middleware.py:
То есть, чтобы отключить вывод исключений надо помимо SOCIAL_AUTH_RAISE_EXCEPTIONS=False иметь DEBUG=False
noBrain,
У меня на 1.5.1 все хорошо, при этом кастомный юзер и т.д.
Valeriy,
то есть на странице бекенда? Тогда не знаю, смотрите настройки своих приложений в этих социалках, наверное что-то неправильно настроили, напримр адрес коллбек-страницы
сделал https://github.com/adw0rd/marcus/issues/6
django-social-auth не отображается в IE. Как-то можно пофиксить?
Имел ввиду django-social-auth-widget. Удобный, но в IE не работает
У меня к сожелению нет IE под рукой, но люди говорят что работает
adw0rd, а не могли бы вы скинуть готовый настроенный проект с БД SQLite, что бы можно было запустить и посмотреть на работу? Был бы вам очень благодарен.
К сожалению у меня не будет на это времени :-(
Вы лучше сами это сделайте и скажите что у вас не получается, и кстати в новом django-social-auth нет бекенда "VKontakteOAuth2Backend", теперь там "social_auth.backends.contrib.vk.VKOAuth2Backend".
И соответственно provider "vk-oauth".
ps. Обновил статью в связи с этими изменениями
Спасибо за статью, а кто подскажет где почитать, как дальше работать а точнее взять к примеру фото из соц. сети и подобную информацию??
Про фото я писал в этой же статье, раздел "Обновление аватарок при авторизации"
Далее надо читать API конкретной сети и использовать. Вот библиотеки которые могут вам помочь:
а через django-social-auth никто не цеплял фото(аватар), порылся в коде модуля там есть конфигурация типа
VK_DEFAULT_DATA = ['first_name', 'last_name', 'screen_name',
'nickname', 'photo']
только пока не понял как запихнуть ее в модель пользователя
Я про это вам уже и сказал. Обычно делается pipeline, который добавляется в SOCIAL_AUTH_PIPELINE и тот код будет подгружать фоточки.
VK_DEFAULT_DATA как и VK_EXTRA_DATA запросят если надо доп. прав и всунут в объект info.get('response') доп. данные, для разной сети они разные, могут быть такими: pic_big, userpic, user_photo и т.п.
Вот такой у меня черновик есть:
Его можете вызывать из pipeline
Буду разбираться спасибо
А как правильно его прописать в pipeline???
Например, создаете модуль "users.pipeline":
Потом в settings указываете:
Сочинил на ходу, не проверял.
Не запускается виджет с django-social-auth 0.7.28:
Fixed https://github.com/adw0rd/django-social-auth-widget/issues/1
2- года . КОнечно блять свежей некуда.
Юзайте python-social-auth
Пардон за глупый вопрос, но работает ли все это счастье на тестовом сервере django, или надо на боевой выкладывать, с реальным доменным именем?
Николай, можно и на тестовом и на локальном
Класс, вот тут как получить креденшелы на фейсбуке со скриншотами https://maketips.net/tip/129/django-social-auth-demo
Оставьте свой комментарий