Люций Корнелий Сципион по прозвищу Бородатый жил в Древнем Риме порядка трёх сотен лет до нашей эры. Был он не самым безвестным человеком. Сначала военачальником, довольно успешным, выигравшим несколько известных битв. А к концу жизни дослужился до должности консула. Но помимо прочего, был он ещё и цензором.

Дойдя до наших дней, слово "цензор" утратило большую часть своих первоначальных значений, и сейчас означает человека, который не пускает к публикации материалы, подвергающие опасности текущий государственый строй. Однако в Древнем Риме основной работой цензора был, как ни странно, ценз. Под цензом понимался всего навсего учёт граждан республики с их имуществом, общественным положением и родом деятельности. По-современному говоря — перепись населения.

Надо сказать, что тогдашние цензоры к этой части своей работы относились без особого трепета, и точность данных этих переписей была довольно условной. Вроде как сейчас. Но вот этот самый Сципион Бородатый был известен как раз тем, что действительно этим занимался, и провёл довольно точную перепись.

И вот вслед за римлянином Цицероном, именем которого я назвал свой форум, я решил взять имя Сципион (Scipio) для своего следующего интересного проекта. Это OpenID-консумер для Джанго, который умеет регистрировать пользователей (буквально вести перепись) и хранить информацию о их лояльности или нелояльности.

Проект Scipio

Сразу самое важное:

В отличие от Cicero, который я делал "в одно лицо" и для себя, Scipio я хочу сделать открытым проектом. Глобальная цель этого проекта — создание хорошего, полнофункционального решения для сайтов на Django, которые хотят принимать у себя OpenID-пользователей. И вообще хочется, чтобы он стал в итоге де-факто OpenID-консумером для Джанго-проектов.

Я уже довольно давно твержу, что основная проблема OpenID, как технологии, в том, что реализовывать её "приёмную" часть довольно трудно, и Scipio — это то, чем я хочу исправить ситуацию.

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

Текущий статус

Сейчас Scipio представляет собой выдранный из Cicero OpenID-консумер, и никаких фич, делающих его очень особенным, в нём пока нет. Однако он уже вполне юзабелен (собственно, форум как раз его сейчас использует). В частности он умеет:

Так что в принципе, его можно уже брать прямо в таком виде.

Тем не менее, у меня туча планов про то, что туда нужно дописать :-). Что именно, и в каком виде там хочется сделать, я в ближайшее время актуализирую на wiki, посвященной проекту.

Философия

OpenID — технология непростая. То есть, она была простой в концепции, когда её придумал Брэд Фицпатрик, но потом она развилась, и оказалось, что она затрагивает много вопросов, связанных с Универсальной Идентификацией, на которые сама конкретного ответа не даёт. Да, собственно, и не должна.

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

Задача Scipio — выдать готовые решения в ответ на эти вопросы, потому что по ним уже накоплен кое-какой опыт использования.

Вместе с тем существуют вопросы, на которые адекватных ответов до сих пор нет, и где нельзя ограничивать свободу эксперимента. Один из таких вопросов — как должна выглядеть форма входа, и должна ли она как-то единообразно выглядеть в прицнипе. В таких местах Scipio будет или не предлагать никаких паттернов или предлагать несколько разных. Сейчас, например, шаблонов для логинной формы там нет вообще, но я хочу добавить несколько.


Итак — прошу пробовать!

Да, и ещё... Проекту срочно нужна хорошая иконка!

Комментарии: 39

  1. Александр Кошелев

    Меня как-то смущает наличие встроенного антиспама... Вроде как вещь для консьюмера достаточно перпендикулярная на мой взгляд. Может есть какая-то глубокая философия и на этот счет?:-)

    А вообще, надо попробовать у себя прикрутить.

    PS: Ланчпад! Бедные мы:-(

  2. Ivan Sagalaev

    Теоретически да, перпендикулярная. Но практически полчается так, что антиспам без понятия белого списка сильно теряет в полезности. OpenID-консумер без антиспама — тоже :-). Потому я решил их не разделять. То есть пока от этого было бы больше возни, чем пользы.

    PS: Ланчпад! Бедные мы:-(

    Ну привык я к Базару :-).

    Впрочем, в Launchpad я в принципе больше верю, потому что он уже open source, а Github и BitBucket ещё нет, насколько я знаю.

  3. Serge Matveenko

    Не согласен, что OpenID consumer - это трудно.

    https://sourceforge.net/projects/simpleopenid/
    Своим названием django-simple-openid нам как бы намекает, что реализовать сие, умно подойдя, очень даже просто.

    Ваш вариант обязательно посмотрю. Раз оно у вас Ъ-опенсорс, может чего-нибудь почерпну.

  4. Stump

    учёт граждан империи с их имуществом

    Республики. Во времена Сципиона в Риме была республика.

  5. Ivan Sagalaev

    Поправил, спасибо!

  6. Alexey Kozlov

    PS: Ланчпад! Бедные мы:-(

    Ну привык я к Базару :-).

    Впрочем, в Launchpad я в принципе больше верю, потому что он уже open source, а Github и BitBucket ещё нет, насколько я знаю.

    Выбирая из этой солянки, я выбрал BitBucket не столько за удобный интерфейс и отсутствие навязчивых непонятных излишеств, сколько за поддержку OpenID "на вход". Это как минимум ещё один фактор, сравнимый (для проекта, посвящённого OpenID) по идеологической значимости с "уже open source".

  7. alxrem

    Иван, зависимость от cicero это бага или фича?

    def create_system_user(username):
        from django.contrib.auth.models import User
        from cicero.models import Profile
    
  8. adw0rd.ru

    Спасибо за библиотеку, сейчас планирую разрабатывать проект http://liburg.ru и планирую использовать Django (первый опыт), библиотеку для OpenID буду вашу использовать, а там посмотрим, может и помогу кодом, аль еще чем...

  9. Ivan Sagalaev

    Алексей, это баг: https://bugs.launchpad.net/scipio/+bug/419814
    Спасибо!

  10. Александр Кошелев

    Не согласен, что OpenID consumer - это трудно.

    Написать "ещё_один_консьюмер" в лоб при наличии уже кучи готовых примеров и референсной имплементации сможет любой мало-мальски знакомый с Джангой. Поэтому их так много и развелось.

    А провязать логику (или дать грамотный интерфейс для этого) и взаимодействие с остальной системой, с профилями, с обработкой идентификаторов - пока никому не удавалось.

    В том то и интерес.

  11. anonymous

    Больше всего во всех существующих консьюмерах для джанго раздражает, что они пытаются делать все сразу. Вот и ваш туда же.

    А хотелось бы просто реюзабельное приложение, которое бы можно было подключить и получить только регистрирацию и авторизацию пользователей, ну и openid-поле для формы логина в комплекте.

    Все. Без белых списков. Без доверия. Без защиты от спамеров. Этим должны заниматься другие приложения. В иделае они должны взаимодействовать при возможности. Unix-way, короче, хотелось бы.

  12. Ivan Sagalaev

    Anonymous, мне, помимо прочего, интересно попробовать сделать приложение, демонстрирующее богатые возможности, которые открывает аутентификация, основанная на URL.

    Однако я вполне согласен с желанием иметь простой консумер, провязанные с contrib.auth. И в общем-то, Scipio сейчас недалеко от него ушёл. Могу порекомендовать (кому-то, кому это больше всех нужно) отфоркаться от моего код и выкинуть лишнее. Антиспам отрывается легко (он зависит от остального кода, не наоборот). Белые списки тоже можно оторвать. Останется форма, пара вьюх и сигналы, на которые можно вешать остальную функциональность. Классный проект, кстати :-).

  13. bialix

    2Александр Кошелев:

    PS: Ланчпад! Бедные мы:-(

    Разверните мысль, пожалуйста. Особенно про бедность интересно.

  14. Serge Matveenko

    Классный проект, кстати :-)

    Сам себя не похвалишь...

  15. Serge Matveenko

    Классный проект, кстати :-)

    или это был комплимент мне? сорри, первая чашку кофе за сегодня еще не допил.;) Тогда, спасибо большое!

  16. Ivan Sagalaev

    Я имел в виду гипотетический проект по форканию кода Scipio и отрыванию лишнего. То есть если бы я не занимался самим Scipio, я бы наверное занялся таким проектом, мне бы понравилось.

  17. Михаил Коробов

    А если разбить Scipio на 2 проекта? Базовый функционал + scipio-antispam какой-нить. У такого подхода есть свои плюсы и минусы, конечно.

  18. Grey3

    Обмен WhiteList-ами и профилями активности приближает нас к Большому Брату.
    Далее, Вы так и не написали пока Ваши ответы на "уйму вещей", которые должен будет давать Scipio.

  19. Артём Сапегин

    А как эту штуку скрестить с обычной регистрацией? Чтобы у пользователя был выбор, как регистрироваться: по OpenId или по логину-паролю.

  20. Ivan Sagalaev

    Артём, сам консумер не надо скрещивать. Вы можете использовать любые удобные вам процессы регистрации. Scipio — это только один из таких процессов, который создаёт стандартного User'а.

  21. Артём Сапегин

    Т. е. можно без проблем сделать вход/регистрацию по OpenID для одних пользователей и по логину-паролю для других? Не как в django-authopenid, который при регистрации по OpenID всё равно спрашивает имя пользователя и шлёт на почту логин-пароль.

  22. Ivan Sagalaev

    Да, можно. Внятной документации у нас, к сожалению, пока нет, поэтому вкратце процесс выглядит так:

    1. Форма входа/регистрации с полем openid_identifier должна приходить на URL, который обрабатывается вьюхой scipio.views.login.
    2. Scipio редиректит человека на его сервер, принимает ответ и проверяет аутентификацию.
    3. Если всё хорошо, то тут же безусловно создаётся новый пользователь с эвристически подобранным username'ом и случайным паролем.
    4. Отсылается сигнал scipio.signals.authenticated, в который передаётся, помимо прочего, этот самый пользователь.

    Соответственно, вам надо повесить на этот сигнал свою функцию, которая может делать с этим новосозданным пользователем, что хочет:

    • показать ему страницу с уникальными для системы полями регистрации
    • тихо оставить зарегистрированным и активировать его в системе
    • удалить из базы, довольствовавшись фактом проверки правильности OpenID
  23. Артём Сапегин

    Иван, огромное спасибо за ответ!

  24. heilkitty

    Насчёт п. 3 - а если пользователь для этого openid уже есть, всё равно создаётся (меня смущает слово "безусловно")?

  25. Ivan Sagalaev

    Если openid есть, то подхватывается существующий пользователь, конечно.

    "Безусловно" относится к тому, что у клиента пока нет способов повлиять на этот процесс. Например, если клиент хочет только проверить принадлежность URL'а пользователю, но не хочет его никак регистрировать, сейчас это делается только последующим удалением созданного пользователя. Потом будет более прямой способ.

  26. heilkitty

    OK, спасибо.
    А python-openid какой версии надо?

  27. Ivan Sagalaev

    У меня 2.2.1 стоит. Подозреваю, что где-то с 2.0 всё должно нормально работать, но не проверял.

  28. Google user

    По теме:

    • Можно посмотреть сайт, который это использует?
    • Сколько OpenID у User?
    • В django-authopenid была (на мой взгляд) большая проблема - при логине юзера обязательно уводили на другую страницу, даже если вход происходит без участия пользователя. Я это решил, но пришлось скопипастить и переписать внушительную часть django-authopenid. Здесь в блоге всё нормально. Когда не требуется моё участие, после кнопки "отправить" будет только форум. Как с этим в Scipio?
  29. Google user

    Нет, я ошибся, сейчас на медленном канале по секунде вижу пустые страницы.

  30. Serge Matveenko

    В django-authopenid была (на мой взгляд) большая проблема

    в django-simpleopenid такого нет

  31. Ivan Sagalaev

    Можно посмотреть сайт, который это использует?

    Форум как раз использует.

    Сколько OpenID у User?

    Пока один, будет несколько.

    В django-authopenid была (на мой взгляд) большая проблема - при логине юзера обязательно уводили на другую страницу. Здесь в блоге всё нормально. Когда не требуется моё участие, после кнопки "отправить" будет только форум.

    Последние два предложения не понял напрочь :-).

    Scipio, когда принимает обратный редирект с подтверждением авторизации, отсылает сигнал, на который можно повеситься и сформировать свой HttpResponse, любой, какой хочется. Если его не будет, Scipio по умолчанию делает редирект на URL, указанный в поле формы "redirect" при сабмите формы с логином. Вот здесь этот код: http://bazaar.launchpad.net/~isagalaev/scipio/trunk/annotate/head%3A/views.py#L31

  32. http://sash-kan.blogspot.com

    … жил … порядка трёх сотен лет … да, были времена. по три сотни лет люди жили. а нынче…

    p.s. поправьте, ведь по-идиотски же звучит. хотя бы «… за три сотни лет до …».

  33. http://sash-kan.blogspot.com

    а по поводу иконки, раз уж ударились в древний рим, так возьмите какую-нибдуь монету тех времён в качестве icon.

    отсюда, например.

  34. ruguevara

    Не, монеты для систем оплаты, а тут, я дамаю, нужна печать какая-то римская. Как граждане подтверждали свое гражданство?

  35. kutu

    как разрулить ситуацию при создании нового профиля, когда отправляются два сигнала created и authenticated

    я вывожу два разных сообщения на эти сигналы, но хочется чтобы при created не диспатчился authenticated

    сейчас я на authenticated делаю проверку

    def on_user_authenticated(sender, **kwargs):
        if len(messages.get_messages(sender)) == 0:
    

    если нет других мессаджов то вывожу мессадж о успешной логине

  36. Ivan Sagalaev

    Подавлять отсылку authenticated неверно, потому что на это может быть завязана какая-то другая логика в системе. Я бы подумал в сторону унификации сообщения (юзерам обычно не интересна разница между "профиль создан" и "залогинен"), которое запускалось бы только на authenticated.

    В любом случае, логика схлопывания сообщений должна жить в коде, который отвечает за сообщения, а не надеятся на порядок посылки/не посылки сигналов.

  37. Вчера вечером я обновил свой блог. Теперь он работает на фреймворке django. Из новых фич — появилась возможность использовать OpenID в комментариях. Спасибо Ивану Сагалаеву за его прекрасный модуль scipio.

  38. Serg

    Прощу прощения за запоздалый новогодний пинг. Сегодня наконец-то разобрался с pingdjack.

    P.S. Если тега <address> нет в target_url, вместо имени автора pingback'а выводится ссылка с пустым анкором. Это наверно баг.

  39. Serg

    P.P.S. У меня в js-шаблоне комментариев есть пустой <address>. У вас Внутри pingdjack.server.parse_data это не проверяется.

    diff --git a/pingdjack/server.py b/pingdjack/server.py
    index b353451..d251b80 100644
    --- a/pingdjack/server.py
    +++ b/pingdjack/server.py
    @@ -82,7 +82,7 @@ def parse_data(source_url, target_url):
         container, node = link.parent, link
         while container:
             address = find(container, 'address', node)
    -        if address:
    +        if address and text(address):
                 author = text(address)
                 break
             container, node = container.parent, container
    

Добавить комментарий