Люций Корнелий Сципион по прозвищу Бородатый жил в Древнем Риме порядка трёх сотен лет до нашей эры. Был он не самым безвестным человеком. Сначала военачальником, довольно успешным, выигравшим несколько известных битв. А к концу жизни дослужился до должности консула. Но помимо прочего, был он ещё и цензором.
Дойдя до наших дней, слово "цензор" утратило большую часть своих первоначальных значений, и сейчас означает человека, который не пускает к публикации материалы, подвергающие опасности текущий государственый строй. Однако в Древнем Риме основной работой цензора был, как ни странно, ценз. Под цензом понимался всего навсего учёт граждан республики с их имуществом, общественным положением и родом деятельности. По-современному говоря — перепись населения.
Надо сказать, что тогдашние цензоры к этой части своей работы относились без особого трепета, и точность данных этих переписей была довольно условной. Вроде как сейчас. Но вот этот самый Сципион Бородатый был известен как раз тем, что действительно этим занимался, и провёл довольно точную перепись.
И вот вслед за римлянином Цицероном, именем которого я назвал свой форум, я решил взять имя Сципион (Scipio) для своего следующего интересного проекта. Это OpenID-консумер для Джанго, который умеет регистрировать пользователей (буквально вести перепись) и хранить информацию о их лояльности или нелояльности.
Проект Scipio
Сразу самое важное:
- страница проекта Scipio на Launchpad
- группа django-openid-scipio на Google Groups (язык английский)
В отличие от Cicero, который я делал "в одно лицо" и для себя, Scipio я хочу сделать открытым проектом. Глобальная цель этого проекта — создание хорошего, полнофункционального решения для сайтов на Django, которые хотят принимать у себя OpenID-пользователей. И вообще хочется, чтобы он стал в итоге де-факто OpenID-консумером для Джанго-проектов.
Я уже довольно давно твержу, что основная проблема OpenID, как технологии, в том, что реализовывать её "приёмную" часть довольно трудно, и Scipio — это то, чем я хочу исправить ситуацию.
Поэтому прошу всех разработчиков, неравнодушных к технологии, присоединяться! Начинайте с обсуждений и попыток попользоваться, а там, глядишь, и накодить что-нибудь захочется.
Текущий статус
Сейчас Scipio представляет собой выдранный из Cicero OpenID-консумер, и никаких фич, делающих его очень особенным, в нём пока нет. Однако он уже вполне юзабелен (собственно, форум как раз его сейчас использует). В частности он умеет:
- аутентифицировать пользователя по OpenID (!)
- заводить Django-пользователя с по возможности хорошим username'ом
- вести OpenID-профиль с никнеймом и галочкой доверия (спамер/не спамер)
- работать с whitelist'ами: отдавать список своих проверенных пользователей и читать списки с чужих сайтов
- проверять активность пользователей через настраиваемый антиспам-конвейер
Так что в принципе, его можно уже брать прямо в таком виде.
Тем не менее, у меня туча планов про то, что туда нужно дописать :-). Что именно, и в каком виде там хочется сделать, я в ближайшее время актуализирую на wiki, посвященной проекту.
Философия
OpenID — технология непростая. То есть, она была простой в концепции, когда её придумал Брэд Фицпатрик, но потом она развилась, и оказалось, что она затрагивает много вопросов, связанных с Универсальной Идентификацией, на которые сама конкретного ответа не даёт. Да, собственно, и не должна.
На практике это приводит к тому, что программист, взявший в руки библиотеку OpenID для своего языка программирования, предстаёт перед уймой вещей, которые можно понять неправильно и сделать всем неудобно:
- считать ли OpenID-пользователя "полноценным"
- "кошерно" ли пропускать OpenID-пользователя через регистрацию
- нужно ли давать юзеру иметь несколько OpenID
- принимать ли всех OpenID-провайдеров или только проверенных
- как работать с SRE
- откуда брать дополнительную информацию о пользователе
- какой из URL'ов считать правильным при использовании делегации
- и т.д.
Задача Scipio — выдать готовые решения в ответ на эти вопросы, потому что по ним уже накоплен кое-какой опыт использования.
Вместе с тем существуют вопросы, на которые адекватных ответов до сих пор нет, и где нельзя ограничивать свободу эксперимента. Один из таких вопросов — как должна выглядеть форма входа, и должна ли она как-то единообразно выглядеть в прицнипе. В таких местах Scipio будет или не предлагать никаких паттернов или предлагать несколько разных. Сейчас, например, шаблонов для логинной формы там нет вообще, но я хочу добавить несколько.
Итак — прошу пробовать!
Да, и ещё... Проекту срочно нужна хорошая иконка!
Комментарии: 39
Меня как-то смущает наличие встроенного антиспама... Вроде как вещь для консьюмера достаточно перпендикулярная на мой взгляд. Может есть какая-то глубокая философия и на этот счет?:-)
А вообще, надо попробовать у себя прикрутить.
PS: Ланчпад! Бедные мы:-(
Теоретически да, перпендикулярная. Но практически полчается так, что антиспам без понятия белого списка сильно теряет в полезности. OpenID-консумер без антиспама — тоже :-). Потому я решил их не разделять. То есть пока от этого было бы больше возни, чем пользы.
Ну привык я к Базару :-).
Впрочем, в Launchpad я в принципе больше верю, потому что он уже open source, а Github и BitBucket ещё нет, насколько я знаю.
Не согласен, что OpenID consumer - это трудно.
https://sourceforge.net/projects/simpleopenid/
Своим названием django-simple-openid нам как бы намекает, что реализовать сие, умно подойдя, очень даже просто.
Ваш вариант обязательно посмотрю. Раз оно у вас Ъ-опенсорс, может чего-нибудь почерпну.
Республики. Во времена Сципиона в Риме была республика.
Поправил, спасибо!
Выбирая из этой солянки, я выбрал BitBucket не столько за удобный интерфейс и отсутствие навязчивых непонятных излишеств, сколько за поддержку OpenID "на вход". Это как минимум ещё один фактор, сравнимый (для проекта, посвящённого OpenID) по идеологической значимости с "уже open source".
Иван, зависимость от cicero это бага или фича?
Спасибо за библиотеку, сейчас планирую разрабатывать проект http://liburg.ru и планирую использовать Django (первый опыт), библиотеку для OpenID буду вашу использовать, а там посмотрим, может и помогу кодом, аль еще чем...
Алексей, это баг: https://bugs.launchpad.net/scipio/+bug/419814
Спасибо!
Написать "ещё_один_консьюмер" в лоб при наличии уже кучи готовых примеров и референсной имплементации сможет любой мало-мальски знакомый с Джангой. Поэтому их так много и развелось.
А провязать логику (или дать грамотный интерфейс для этого) и взаимодействие с остальной системой, с профилями, с обработкой идентификаторов - пока никому не удавалось.
В том то и интерес.
Больше всего во всех существующих консьюмерах для джанго раздражает, что они пытаются делать все сразу. Вот и ваш туда же.
А хотелось бы просто реюзабельное приложение, которое бы можно было подключить и получить только регистрирацию и авторизацию пользователей, ну и openid-поле для формы логина в комплекте.
Все. Без белых списков. Без доверия. Без защиты от спамеров. Этим должны заниматься другие приложения. В иделае они должны взаимодействовать при возможности. Unix-way, короче, хотелось бы.
Anonymous, мне, помимо прочего, интересно попробовать сделать приложение, демонстрирующее богатые возможности, которые открывает аутентификация, основанная на URL.
Однако я вполне согласен с желанием иметь простой консумер, провязанные с contrib.auth. И в общем-то, Scipio сейчас недалеко от него ушёл. Могу порекомендовать (кому-то, кому это больше всех нужно) отфоркаться от моего код и выкинуть лишнее. Антиспам отрывается легко (он зависит от остального кода, не наоборот). Белые списки тоже можно оторвать. Останется форма, пара вьюх и сигналы, на которые можно вешать остальную функциональность. Классный проект, кстати :-).
2Александр Кошелев:
Разверните мысль, пожалуйста. Особенно про бедность интересно.
Сам себя не похвалишь...
или это был комплимент мне? сорри, первая чашку кофе за сегодня еще не допил.;) Тогда, спасибо большое!
Я имел в виду гипотетический проект по форканию кода Scipio и отрыванию лишнего. То есть если бы я не занимался самим Scipio, я бы наверное занялся таким проектом, мне бы понравилось.
А если разбить Scipio на 2 проекта? Базовый функционал + scipio-antispam какой-нить. У такого подхода есть свои плюсы и минусы, конечно.
Обмен WhiteList-ами и профилями активности приближает нас к Большому Брату.
Далее, Вы так и не написали пока Ваши ответы на "уйму вещей", которые должен будет давать Scipio.
А как эту штуку скрестить с обычной регистрацией? Чтобы у пользователя был выбор, как регистрироваться: по OpenId или по логину-паролю.
Артём, сам консумер не надо скрещивать. Вы можете использовать любые удобные вам процессы регистрации. Scipio — это только один из таких процессов, который создаёт стандартного User'а.
Т. е. можно без проблем сделать вход/регистрацию по OpenID для одних пользователей и по логину-паролю для других? Не как в django-authopenid, который при регистрации по OpenID всё равно спрашивает имя пользователя и шлёт на почту логин-пароль.
Да, можно. Внятной документации у нас, к сожалению, пока нет, поэтому вкратце процесс выглядит так:
openid_identifier
должна приходить на URL, который обрабатывается вьюхойscipio.views.login
.scipio.signals.authenticated
, в который передаётся, помимо прочего, этот самый пользователь.Соответственно, вам надо повесить на этот сигнал свою функцию, которая может делать с этим новосозданным пользователем, что хочет:
Иван, огромное спасибо за ответ!
Насчёт п. 3 - а если пользователь для этого openid уже есть, всё равно создаётся (меня смущает слово "безусловно")?
Если openid есть, то подхватывается существующий пользователь, конечно.
"Безусловно" относится к тому, что у клиента пока нет способов повлиять на этот процесс. Например, если клиент хочет только проверить принадлежность URL'а пользователю, но не хочет его никак регистрировать, сейчас это делается только последующим удалением созданного пользователя. Потом будет более прямой способ.
OK, спасибо.
А python-openid какой версии надо?
У меня 2.2.1 стоит. Подозреваю, что где-то с 2.0 всё должно нормально работать, но не проверял.
По теме:
Нет, я ошибся, сейчас на медленном канале по секунде вижу пустые страницы.
в django-simpleopenid такого нет
Форум как раз использует.
Пока один, будет несколько.
Последние два предложения не понял напрочь :-).
Scipio, когда принимает обратный редирект с подтверждением авторизации, отсылает сигнал, на который можно повеситься и сформировать свой HttpResponse, любой, какой хочется. Если его не будет, Scipio по умолчанию делает редирект на URL, указанный в поле формы "redirect" при сабмите формы с логином. Вот здесь этот код: http://bazaar.launchpad.net/~isagalaev/scipio/trunk/annotate/head%3A/views.py#L31
p.s. поправьте, ведь по-идиотски же звучит. хотя бы «… за три сотни лет до …».
а по поводу иконки, раз уж ударились в древний рим, так возьмите какую-нибдуь монету тех времён в качестве icon.
отсюда, например.
Не, монеты для систем оплаты, а тут, я дамаю, нужна печать какая-то римская. Как граждане подтверждали свое гражданство?
как разрулить ситуацию при создании нового профиля, когда отправляются два сигнала created и authenticated
я вывожу два разных сообщения на эти сигналы, но хочется чтобы при created не диспатчился authenticated
сейчас я на authenticated делаю проверку
если нет других мессаджов то вывожу мессадж о успешной логине
Подавлять отсылку authenticated неверно, потому что на это может быть завязана какая-то другая логика в системе. Я бы подумал в сторону унификации сообщения (юзерам обычно не интересна разница между "профиль создан" и "залогинен"), которое запускалось бы только на authenticated.
В любом случае, логика схлопывания сообщений должна жить в коде, который отвечает за сообщения, а не надеятся на порядок посылки/не посылки сигналов.
Прощу прощения за запоздалый новогодний пинг. Сегодня наконец-то разобрался с pingdjack.
P.S. Если тега
<address>
нет в target_url, вместо имени автора pingback'а выводится ссылка с пустым анкором. Это наверно баг.P.P.S. У меня в js-шаблоне комментариев есть пустой
<address>
. У вас Внутри pingdjack.server.parse_data это не проверяется.