1. Виктор Борнов

    28.03.2011

    0 ↑
    0 ↓
    Использую в своем проекты авторизацию с помощью OpenId.
    Использую модуль https://github.com/krvss/django-social-auth. Это форк от основной ветки и там дописана поддержка yandex и vkontakte.

    Но вот через яндекст что то не получается авторизироваться. Вылетает следующая ошибка
    ValueError at /login/yandex/

    Missing Yandex user identifier

    Request Method: GET
    Request URL: http://127.0.0.1:8000/login/yandex/
    Django Version: 1.3
    Exception Type: ValueError
    Exception Value:

    Missing Yandex user identifier

    Exception Location: /home/vic/sites/RB-ENV/lib/python2.6/site-packages/social_auth/backends/contrib/yandex.py in openid_url, line 39
    Python Executable: /home/vic/sites/RB-ENV/bin/python
    Python Version: 2.6.5
    Python Path:

    ['/home/vic/sites/rb',
    '/home/vic/sites/RB-ENV/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg',
    '/home/vic/sites/RB-ENV/lib/python2.6/site-packages/pip-0.8.2-py2.6.egg',
    '/home/vic/sites/RB-ENV/lib/python2.6/site-packages/egenix_mx_base-3.1.2-py2.6-linux-i686.egg',
    '/home/vic/sites/RB-ENV/lib/python2.6',
    '/home/vic/sites/RB-ENV/lib/python2.6/plat-linux2',
    '/home/vic/sites/RB-ENV/lib/python2.6/lib-tk',
    '/home/vic/sites/RB-ENV/lib/python2.6/lib-old',
    '/home/vic/sites/RB-ENV/lib/python2.6/lib-dynload',
    '/usr/lib/python2.6',
    '/usr/lib/python2.6/plat-linux2',
    '/usr/lib/python2.6/lib-tk',
    '/home/vic/sites/RB-ENV/lib/python2.6/site-packages',
    '/home/vic/sites/RB-ENV/lib/python2.6/site-packages/PIL']

    Server time: Mon, 28 Mar 2011 22:11:32 +0400
    Бэкенд для яндекса в settings прописал.
    В чем может быть причина ошибки?
  2. qbuben

    28.03.2011

    1 ↑
    1 ↓

    Как раз ошибка вылетает в бэкенде...

    http://www.ikrvss.ru/2011/01/22/django-social-auth/ вот ведь блог автора и он поясняет ошибку с yandex

  3. Виктор Борнов

    29.03.2011

    0 ↑
    0 ↓
    >>Когда вы, авторизуясь на Yandex через OpenId, ставите галочку «передать дополнительные параметры», в Django почему-то возникает нарушение целостности или потеря csrf-информации. Чтобы не возникала ошибка, можно указать свою функцию для завершения авторизации (параметр SOCIAL_AUTH_COMPLETE_URL_NAME), которая будет отличаться только наличием декоратора csrf_exempt_view и состоять из вызова social_auth.complete.

    Я про эту ошибку знаю. Но в моем случае это не она. Ошибка вылетает гораздо раньше.
  4. krvss

    29.03.2011

    1 ↑
    0 ↓
    Возможная причина ошибки: из формы не получается user name пользователя на яндексе. Например, имя поля в форме не соответствует ожиданиям программы. Рабочий пример есть в самой библиотеке, исходник можно посмотреть вот тут:

    https://github.com/krvss/django-social-auth/blob/master/example/templates/home.html
          <form action="{% url begin "yandex" %}" method="post">{% csrf_token %}
    <div>
    <label for="openid_ya_user">Yandex user:</label>
    <input id="openid_ya_user" type="text" value="" name="openid_ya_user" />
    <input type="submit" value="Login"/>
    </div>
    </form>

    Вообще вопросы можно прямо мне писать :) Если бы не trackback - я бы и не узнал.
  5. Виктор Борнов

    31.03.2011

    0 ↑
    0 ↓
    Спасибо, krvss!
    Я просто не правильно использовал авторизацию через yandex.
    Я вызывал юрл 'http://sites.ru/login/yandex' без формы ввода, думал что должно работать по аналоги с google и yahoo.

    Вот тогда такой вопрос возник. Если для авторизации через yandex нужно использщовать форму и вводить свой идентификатор, то что делает YandexBackend?
    Можно же также вводить свой OpenId в форму "Other provider".
  6. krvss

    31.03.2011

    1 ↑
    0 ↓
    YandexBackend делает 4 вещи:
    1. Пользователю не нужно вводить URL для авторизации на яндексе целиком, это достаточно неудобно. Есть рекомендации избегать этого, и я с ними согласен - на каждом сервисе строка разная, заставлять пользователя ее искать это достаточно жестко.

    2. По имени пользователя на yandex можно сделать заключение о его адресе электронной почты, что, например, для нашей системы достаточно ценно. YandexBackend заполняет поле e-mail при прохождении регистрации.

    3. Так как имя backend указано явно (yandex) то оно так и попадет в таблицу социальной регистрации, и потом удобно определять, через какую систему зарегистрирован пользователь. Для нас это также было удобно и важно (есть функциональность "отвязки" от соцсетей). Если использовать openid backend для авторизации на яндексе, то в базе будет лежать его имя, чтобы потом разобраться потребуются лишние действия.

    4. Было время, когда требовались определенные дополнительные действия, чтобы обеспечить беспроблемную авторизацию (были особенности в реализации библиотеки). И возможно это снова понадобится в будущем. Сейчас, если есть желание, то можно работать и напрямую, через openid backend. Это позволит сэкономить чуть больше 1 килобайта места на диске (столько сейчас весит исходный код YandexBackend) :))
  7. Виктор Борнов

    31.03.2011

    0 ↑
    0 ↓
    krvss, все расставили по полочкам.
    Спасибо!
  8. Ivan Sagalaev

    01.04.2011

    0 ↑
    0 ↓

    Я тоже хочу прокомментировать :-).

    1. Пользователю не нужно вводить URL для авторизации на яндексе целиком, это достаточно неудобно. Есть рекомендации избегать этого, и я с ними согласен - на каждом сервисе строка разная, заставлять пользователя ее искать это достаточно жестко.

    По идее, пользователю вообще ничего вводить не нужно. О какой строчке тут речь?

    1. По имени пользователя на yandex можно сделать заключение о его адресе электронной почты,

    И это будет неверное заключение в общем случае. Да, для большинства пользователей это, наверное, так и есть, но есть два заметных исключения:

    • в Яндекс не всю жизнь email пользователя брался из логина, и у старых пользователей они реально различаются
    • даже если у человека технически есть этот email, он не обязан его читать, для чего на всех внутрияндексовых сервисах в настройках можно указать предпочитаемый email

    Поэтому лучше пользоваться заложенной в OpenID возможностью и просить email через SREG и AX. И уважать решение юзера, если он решит email не отдавать.

  9. krvss

    01.04.2011

    0 ↑
    0 ↓
    Иван, привет!

    > По идее, пользователю вообще ничего вводить не нужно. О какой строчке тут речь?

    А username как же? :)

    > И это будет неверное заключение в общем случае.

    У меня было такое предчувствие. В общем не совсем корректный заход, согласен. Скорее всего уберу его из YandexBackend.
  10. Ivan Sagalaev

    01.04.2011

    0 ↑
    0 ↓

    А username не нужен. Начиная со времён OpenID 2.0 юзеру достаточно прислать только название своего сервера (в нашем случае это http://www.yandex.ru/), а дальше консумер отсылает юзера на сервер, там по залогиненности юзера определяется, кто он такой, и в итоге с сервера на консумер возвращается правильный персональный пользовательский URL.

    Интерфейсно всё это вырождается в одну кнопку "Войти через Яндекс" — а дальше консумер должен просто передать адрес сервера в consumer.begin, он один на всех.

  11. krvss

    02.04.2011

    0 ↑
    0 ↓
    Интересно, спасибо! Отличная штука OpenID 2.0, не знал. Причем, насколько я понял, python-openid ее уже поддерживает. Тогда имеет смысл для Yandex сделать openid2.0 backend, и в нем останутся только фишки 3 и 4.
    Хотя нет, первая в урезанном виде тоже останется.
  12. Виктор Борнов

    04.04.2011

    0 ↑
    0 ↓
    Да, было бы здорово для яндекса иметь просто кнопку для входа.
    Интересно, а почему для LiveJournal не обойтись без формы для ввода идентификатора, он не поддерживает OpenID 2.0?
  13. Ivan Sagalaev

    04.04.2011

    0 ↑
    0 ↓

    Так нет никакой проблемы поставить себе на сайт эту кнопку. Вон, на http://officeband.ru/ она уже сто лет висит.

    А ЖЖ, да, вторую версию не поддерживает. У меня вообще сложилось ощущение, что им OpenID давно не интересен.

  14. krvss

    04.04.2011

    0 ↑
    0 ↓
    Коммитнул версию без юзернейма. Теперь достаточно ссылку кликнуть.
  15. Виктор Борнов

    04.04.2011

    0 ↑
    0 ↓
    krvss, обновился, потестировал.
    Что то ошибка выскакивает.

    Вот что прописывается в сессию ('social_errors')

    OpenID authentication failed: return_to does not match return URL. Expected 'http://127.0.0.1:8000/complete/yandex/?janrain_nonce=2011-04-04T11%3A51%3A15ZGpC1Nr', got u'http://127.0.0.1:8000/complete/yandex/?janrain_nonce=2011-04-04T11%3A51%3A15ZGpC1Nr'
  16. krvss

    04.04.2011

    0 ↑
    0 ↓
    Скорее всего при авторизации стоял флажок "передать дополнительные данные", а в самих данных что-то было указано. За подробностями вот на этот пост: http://softwaremaniacs.org/forum/openid/29654/?page=last#173356

    Ждем, пока поправят python-openid.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.