Внедрение OpenID на PHP

Логотип OpenID. Взято с Википедии.
Логотип OpenID. Взято с Википедии.

Таки здравствуй, дражайший читатель.

Вообще, не люблю я писать о работе (хотя статистика количества записей в рубрике соответствующей и ставит под сомнение данное утверждение). Но тут прямо не мог не написать. Все вы, коллеги-PHP-шники, разумеется слышали про такую адову приблуду, как OpenID. Если вкратце, то оная позволяет авторизовать пользователей на разных сайтах под одной учётной записью. Например у меня есть почтовый ящик Google, и с его помощью я могу быть авторизован на сайтах, поддерживающих такой вид авторизации. Т.е. мне не надо придумывать пароль/логин, для того, чтобы войти на сайт. При этом сам ресурс не узнаёт лишнего, он знает только то, что я — это я (ибо доверенный openid сервер это подтверждает). Так вот, вроде бы идея то, конечно, хорошая… Однако на пути внедрения оной становятся несколько проблем. Первая — отсутствие более или менее подробной информации по протоколу/стандарту на русском языке. Вторая — большой набор библиотек, позволяющих (теоретически) проводить безболезненное внедрение OpenID авторизации у себя на сайте. Третья — это наличие нескольких стандартов openid (хотя само по себе это не проблема). И четвёртая — это разная степень развитости этих библиотек, напрямую вытекающая из третьей. Есть ещё и пятая — библиотеки используют разные способы общения с серверами авторизации, самый распространённый — это curl-запросы, которые априори требуют наличия в установленном на сервере PHP расширения curl или компиляции, с опцией —with-curl. Вообще на нормальных хостингах он должен быть включен, однако… как показывает практика — не везде он есть. В общем, все дальнейшие рассуждения основываются на том, что curl таки есть, либо есть возможность его поставить. Просто найти библиотеку, которая бы его не использовала — на самом деле очень сложно.

Почему речь идёт именно о библиотеках? Да нет, не вопрос на самом деле — спокойно можно изучить протокол и написать что-либо своё, родное. Но. Это потребует достаточно длительных танцев над отладчиком и над описанием протокола. Хозяин, как говорится, барин. Но коммерческая разработка требует быстрого решения — у вас как правило не будет недели-двух на написание собственной реализации. Потому использование библиотек — вполне оправдано, при условии их качества.

Итак, что мы имеем на сегодняшний день? Существует наиболее известный вариант реализации — это Simple OpenID PHP Class. На данный момент есть версия 3. Для скачивания требует авторизации на сервисе, куда ведёт данная ссылка. Честно скажу — у меня он с полупинка не заработал. Код удивил наличием закомментированных участков, и при этом отсутствием описательных комментариев (за исключением того, что приведено вверху файла). Нет, кое-чего я от него добился — но в рамках прикладной задачи это оказалось не совсем то, что требовалось.

Также существует несколько вариантов реализации в готовых фреймворках (Zend, Symfony, etc) — но в нашем проекте фреймворки не используются. Опять же постановка задачи заказчиком. Если ваш проект работает на каком-либо — то возможно вам больше подойдёт реализуемый ими функционал.

Есть также PHP OpenID Library — эта позволяет не только авторизацию на сайте сделать, но и может служить сервером OpenID. Как вы понимаете, за такую возможность надо расплачиваться — сама библиотека довольно монструозна, и с полупинка её запустить, подозреваю, тоже не выйдет (я и не пытался — размер дистрибутива в 500 кб вызвал дисфункцию программистской потенции).

В общем, пока суть да дело, нашёл то, что отвечало требованиям — лёгкость, понятность, простота подключения и запуска. LightOpenID (качается без регистрации, просто поищите вверху страницы требуемую закладку). В комплекте идёт, собственно, реализующий протокол класс, и пример его использования. Пример исчерпывающе объясняет — как сделать авторизацию.

Но кроме, собственно, проблемы выбора библиотек, существует проблемка посерьёзнее. Из дружественных к разработчику сервисов — оказался только один, и это, вполне ожидаемо, Google. Дело в том, что протокол подразумевает изначальную загрузку XML-файла, который объясняет библиотеке, что ей дальше делать и как жить. Соответственно, нужен УРЛ, с которого мы собираемся всё это тянуть. У Google от чудесно документирован, всё разжёвано и разложено по полочкам. И таки да, с сервером Google данная библиотека начинает работает через 2 минуты после правки примера. Т.е. я авторизуюсь по OpenID на их сервере, с помощью своего email-пароль, и на локальную машину приходит ответ: «Ай шайтанама, всё хорошо, пользователь авторизовался». Урл кстати вот: https://www.google.com/accounts/o8/id — и он в документации прописан.

Проблемы начинаются в том, что не все россиянцы используют кошерный гугл. Некоторые предпочитают трефные яндекс, майл и рамблер. А поскольку их до хуя и даже больше, требуется реализовать ещё и работу с этими сервисами. И вот тут надо доставать из загашника бубен, благовония, культовые принадлежности и возможно даже какой-нибудь кинжал для жертвоприношений. Потому что, несмотря на слёзные уверения российских сервисов в том, что они таки да, предоставляют возможность OpenID авторизации — сносной документации нигде нет, а то, что есть — это ложь, пиздёжь и провокация. Для начала проблемы начинаются в поиске УРЛа, с которого можно получить требуемый XML. А его нет нигде! Нет, может быть реализация протокола другая… Но блять! Почему это не оговорить отдельно в документации, которую предварительно, пусть самую общую, написать?!!! Или у хуяндекса или срамблера на это денег нет?!… Нет, существует только урл HTML-страницы авторизации, без малейшего намёка на XML. Естественно библиотека говорит «невозможно открыть хост». В общем… В общем пока я ищу пути наладки работы с openid-сервисами рашки. Как найду — дополню заметку (между прочим, те урлы, которые описаны в сети по типу http://<nick>.ya.ru/ тоже нихерища не работают).

В заключение вот вам полезная ссылочка: http://wiki.openid.net/w/page/12995176/Libraries (естественно, англ. На русском ничего доброго не сыскать) — довольно много интересного и полезного сказано по теме.

… Страна-то нетипичная, страна неординарная
У нас любое действие всегда нолю равно…
Системы — бессистемные, стандарты — нестандартные
Пространство — неевклидово, хер знает, чьё оно…

Т. Шаов.

Автор

Алекс Разгибалов

Сумасшедший мужчина, неопределённого возраста, наслаждающийся манией преследования. Паталогически недоверчив, эгоистичен, авторитарен. Вторичные диагнозы - программист и поц. Владеет английским языком на уровне около хренового разговорного. Также знаком с некоторыми другими языками. Интересуется всем и вся, за счёт чего в любой области знания являются поверхностными, неглубокими. Характер невыдержанный. Крепость - 55 градусов.

Внедрение OpenID на PHP: 2 комментария

  1. Сейчас с классом вожусь. Бубен благовония, а также 8 абзац вашего поста в голове так и вертится.
    На руском практически ничего путного нет.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Собирать идеально - не обязательно, просто приблизительно соберите картинку (должен быть включен JavaScript).WordPress CAPTCHA