Внедрение OpenID на PHP
Таки здравствуй, дражайший читатель.
Вообще, не люблю я писать о работе (хотя статистика количества записей в рубрике соответствующей и ставит под сомнение данное утверждение). Но тут прямо не мог не написать. Все вы, коллеги-PHP-шники, разумеется слышали про такую адову приблуду, как . Если вкратце, то оная позволяет авторизовать пользователей на разных сайтах под одной учётной записью. Например у меня есть почтовый ящик Google, и с его помощью я могу быть авторизован на сайтах, поддерживающих такой вид авторизации. Т.е. мне не надо придумывать пароль/логин, для того, чтобы войти на сайт. При этом сам ресурс не узнаёт лишнего, он знает только то, что я - это я (ибо доверенный openid сервер это подтверждает). Так вот, вроде бы идея то, конечно, хорошая... Однако на пути внедрения оной становятся несколько проблем. Первая - отсутствие более или менее подробной информации по протоколу/стандарту на русском языке. Вторая - большой набор библиотек, позволяющих (теоретически) проводить безболезненное внедрение OpenID авторизации у себя на сайте. Третья - это наличие нескольких стандартов openid (хотя само по себе это не проблема). И четвёртая - это разная степень развитости этих библиотек, напрямую вытекающая из третьей. Есть ещё и пятая - библиотеки используют разные способы общения с серверами авторизации, самый распространённый - это curl-запросы, которые априори требуют наличия в установленном на сервере PHP расширения curl или компиляции, с опцией --with-curl. Вообще на нормальных хостингах он должен быть включен, однако... как показывает практика - не везде он есть. В общем, все дальнейшие рассуждения основываются на том, что curl таки есть, либо есть возможность его поставить. Просто найти библиотеку, которая бы его не использовала - на самом деле очень сложно.
Почему речь идёт именно о библиотеках? Да нет, не вопрос на самом деле - спокойно можно изучить протокол и написать что-либо своё, родное. Но. Это потребует достаточно длительных танцев над отладчиком и над описанием протокола. Хозяин, как говорится, барин. Но коммерческая разработка требует быстрого решения - у вас как правило не будет недели-двух на написание собственной реализации. Потому использование библиотек - вполне оправдано, при условии их качества.
Итак, что мы имеем на сегодняшний день? Существует наиболее известный вариант реализации - это . На данный момент есть версия 3. Для скачивания требует авторизации на сервисе, куда ведёт данная ссылка. Честно скажу - у меня он с полупинка не заработал. Код удивил наличием закомментированных участков, и при этом отсутствием описательных комментариев (за исключением того, что приведено вверху файла). Нет, кое-чего я от него добился - но в рамках прикладной задачи это оказалось не совсем то, что требовалось.
Также существует несколько вариантов реализации в готовых фреймворках (Zend, Symfony, etc) - но в нашем проекте фреймворки не используются. Опять же постановка задачи заказчиком. Если ваш проект работает на каком-либо - то возможно вам больше подойдёт реализуемый ими функционал.
Есть также - эта позволяет не только авторизацию на сайте сделать, но и может служить сервером OpenID. Как вы понимаете, за такую возможность надо расплачиваться - сама библиотека довольно монструозна, и с полупинка её запустить, подозреваю, тоже не выйдет (я и не пытался - размер дистрибутива в 500 кб вызвал дисфункцию программистской потенции).
В общем, пока суть да дело, нашёл то, что отвечало требованиям - лёгкость, понятность, простота подключения и запуска. (качается без регистрации, просто поищите вверху страницы требуемую закладку). В комплекте идёт, собственно, реализующий протокол класс, и пример его использования. Пример исчерпывающе объясняет - как сделать авторизацию.
Но кроме, собственно, проблемы выбора библиотек, существует проблемка посерьёзнее. Из дружественных к разработчику сервисов - оказался только один, и это, вполне ожидаемо, Google. Дело в том, что протокол подразумевает изначальную загрузку XML-файла, который объясняет библиотеке, что ей дальше делать и как жить. Соответственно, нужен УРЛ, с которого мы собираемся всё это тянуть. У Google от чудесно документирован, всё разжёвано и разложено по полочкам. И таки да, с сервером Google данная библиотека начинает работает через 2 минуты после правки примера. Т.е. я авторизуюсь по OpenID на их сервере, с помощью своего email-пароль, и на локальную машину приходит ответ: "Ай шайтанама, всё хорошо, пользователь авторизовался". Урл кстати вот: https://www.google.com/accounts/o8/id - и он в документации прописан.
Проблемы начинаются в том, что не все россиянцы используют кошерный гугл. Некоторые предпочитают трефные яндекс, майл и рамблер. А поскольку их до хуя и даже больше, требуется реализовать ещё и работу с этими сервисами. И вот тут надо доставать из загашника бубен, благовония, культовые принадлежности и возможно даже какой-нибудь кинжал для жертвоприношений. Потому что, несмотря на слёзные уверения российских сервисов в том, что они таки да, предоставляют возможность OpenID авторизации - сносной документации нигде нет, а то, что есть - это ложь, пиздёжь и провокация. Для начала проблемы начинаются в поиске УРЛа, с которого можно получить требуемый XML. А его нет нигде! Нет, может быть реализация протокола другая... Но блять! Почему это не оговорить отдельно в документации, которую предварительно, пусть самую общую, написать?!!! Или у хуяндекса или срамблера на это денег нет?!... Нет, существует только урл HTML-страницы авторизации, без малейшего намёка на XML. Естественно библиотека говорит "невозможно открыть хост". В общем... В общем пока я ищу пути наладки работы с openid-сервисами рашки. Как найду - дополню заметку (между прочим, те урлы, которые описаны в сети по типу http://<nick>.ya.ru/ тоже нихерища не работают).
В заключение вот вам полезная ссылочка: (естественно, англ. На русском ничего доброго не сыскать) - довольно много интересного и полезного сказано по теме.
... Страна-то нетипичная, страна неординарная
У нас любое действие всегда нолю равно...
Системы - бессистемные, стандарты - нестандартные
Пространство - неевклидово, хер знает, чьё оно...
Т. Шаов.
В мавзолее спит Ильич. Спит долго, спокойно. Всё оттого, что ему читают этот RSS канал вслух...
В тему
Понравилась статья?
Нет обратных ссылок на эту запись.

Февраль 10th, 2011 - 02:04
Сейчас с классом вожусь. Бубен благовония, а также 8 абзац вашего поста в голове так и вертится.
На руском практически ничего путного нет.
Февраль 10th, 2011 - 18:38
Тащемта, в процессе поисков был найден Yadis урл для яндекса. Вот: – ЧСХ, нет гарантии, что это будет работать, но как отправная точка поисков – сойдёт в принципе.