Рекомендации для начинающих работать с Django Social Auth

18 октября 2011

Меня часто спрашивают, а я ленюсь отвечать одно и то же. Поэтому хочу здесь дать несколько практических советов тем, кто начинает разбираться с 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, а выводит сообщение об ошибке и закрывает попап.

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

Comments closed