OpenID. Тест OpenId-провайдеров

January 18, 2008

Прошлую статью я закончил на мажорной ноте. Зря. Сегодня я попробовал работать с провайдерами и consumer-ами openid поближе и понял, что для всеобщего внедрения поддержки openid в разные сайты, форумы и блогики еще очень долго(я говорю не о серьезных проектах, которые могут нанять отдельных технических специалистов). И основная причина в том, что реклама рекламой, сообщества сообществами, но лучше было бы выпустить официальный SDK от создателей openid, SDK поддерживающий различные языки программирования и совсем неплохо было бы сделать подобные инструменты для популярных блог-платформ, CMS-ок и прочих веб-движков. Заняло бы это работы для небольшой команды программистов не больше чем на пару месяцев, а пользы гораздо больше.

В прошлый раз я внедрил поддержку openid в mediawiki. А на следующий день решил написать пару комментариев в некотором блоге, указав при этом свой openid-идентификатор (каждая учетная запись в mediawiki получает openid-идентификатор на своей персональной странице). Не получилось: сообщение об ошибке гласило, что указанная страница не содержит openid-тегов. Тогда я решил провести более тщательное исследование. Я не буду называть конкретные адреса сайтов, но статистика такова в лучшем случае один сайт из трех оказался способным принять мой openid-идентификатор. Я открыл каталог сайтов поддерживающих openid (его можно найти по адресу http://openiddirectory.com/), затем перебирал сайт по очереди и пробовал зарегистрироваться, написать сообщение ... Ошибки были различные: иногда мне говорили, что указанное мною значение openid-идентификатора не является корректным, иногда выполнялся переход на страницу аутентификации (страница mediawiki), но обратный переход не работал. Решив, что баги, с большой долей вероятности, не у других сайтов, а в моем mediawiki плагине, я решил заняться серфингом по сети и найти там настоящий и рабочий openid-сервер. Заодно я попробую потестировать библиотеки openid consumer-ов, ну и посмотрим, чем это все закончится.

Сразу сообщаю, что особенности моей конфигурации компьютера таковы, что все сайты я размещаю в отдельных папках (не в корне сайта). Также я люблю тестировать код на работоспособность под нестандартными номерами портов (apache у меня работает под 89 а microsoft iis под 80-ым). Работоспособность всех перечисленных ниже серверов я проверял как под своей конфигурацией по умолчанию так и под "идеальными настройками". Для этого я запустил apache на 80-ом порту и для каждого из серверов и приложений тестирования (consumer-ов) я создал отдельный домен (соответственно, все файлы и скрипты были размещены в корне сайтов).

Относительно теста под нестандартными настройками - не заработал ни один из серверов. - Ни один



Неприятно, но не страшно в отличие от consumer-ов, которые приходится встраивать в существующие веб-приложения (и адрес скрипта может быть произвольным) для openid-сервера можно создать и отдельный под-домен на вашем сайте - не жалко.

Чем я тестировал серверы?



Использованы были два standalone примера consumer-ов, а также три реализации consumer-ов реализованных как плагины к известным веб-платформам:

Тест номер 1 был проведен с помощью примера consumer-а идущего вместе с библиотекой http://www.openidenabled.com/openid/libraries/php/.



Тест два был проведен с помощью библиотеки " Simple OpenID PHP Class" загруженной с сайта http://www.fivestores.com/. Эта библиотека не содержит кода для openid-сервера - только для клиента. И надо сказать, что api этой библиотеки мне понравился своей простотой и минимализмом и подробными комментариями.



Также я использовал для тестов wordpress с установленным плагином OpenID Comments for WordPress от Alexander Nikulin (http://the-notebook.org/12/01/2006/openid-comments-for-wordpress/). В дальшейшем списке это тест номер 3. Неплохо было бы выполнить тест и этого плагина как openid-сервера (дело в том, что плагин реализует функциональность openid-провайдера). С другой стороны мне не нравится идея устанавливать на сайт отдельный wordpress, используемый только как провайдер openid, т.к. у меня сайт построен на базе mediawiki с уже реализованной openid-функциональностью. С другой стороны, если ваш сайт построен на базе wordpress, то можете считать, что ваши поиски уже увенчались успехом. Ну, а я продолжу тест standalone-серверов.

Тест номер 4 выполнялся с помощью drupal и установленного плагина DrupalOpenID.



Тест номер 5 был выполнен с помощью плагина к mediawiki.



Надо сказать что ожидать отличий в поведении между тестами 1 и 4, 5 довольно тяжело, так как они все используют один и тот же движок или библиотеку (http://www.openidenabled.com/openid/libraries/php). Тесты же номер 2 и 3 используют для работы различные библиотеки.

Также следует отметить, что библиотеки 1, 2, 3, 5 успешно приняли openid-идентификаторы, которые были предоставлены mediawiki (ну это еще ни о чем не говорит) и (а это как раз говорит кое о чем) приняли openid-идентификаторы Живого Журнала. Что касается тестов модуля для drupal, то он не заработал. Хотя, с другой стороны я полагаю, что, возможно "я просто не умею их готовить".

Сервер номер 1.



http://siege.org/projects/phpMyID/. Это не большой однопользовательский провайдер openid (весь код состоит только из двух файлов и никаких дополнительных библиотек для работы не требует). "Однопользовательский" - значит, что в единицу времени провайдер может представлять сведения только об одном человеке. Имя этого пользователя, адрес электронной почты, пол, пароль и прочее нужно ввести в конфигурационном файле MyID.config.php. Для обращения к серверу необходимо запустить именно этот файл (в документации рекомендуют переименовать файл, дав им более привычные имена, например, index.php).



Результаты тестирования:

В нестандартном режиме не заработал ни для одного из openid consumer-ов. Выводилась ошибка "Authentication error; not a valid OpenID.".

В стандартном режиме: Заработали тесты номер 2 и 3. Тест 1 и Тест 4 "не завелись" выведя одинаковую ошибку "Authentication error; not a valid OpenID.". Тест номер 5 также не заработал, хотя сообщение об ошибке было более странное "An error occured during verification of the OpenID URL. ".

Сервер номер 2



Следующим я проверил openid-сервер "PHP OpenID Server by JanRain, Inc". Как вы догадались по названию, в основе этого сервера лежит библиотека http://www.openidenabled.com/openid/libraries/php. Здесь процедура установки не столь минималистическая как в предыдущем примере: нужно создать базу данных и указать параметры подключения к ней в файле config.php. Пользователей может быть произвольное количество, и управлять ими возможно через веб-интерфейс. Для запуска сервера править файл config.php и указать там пути к библиотеке smarty (в поставке сервера smarty нет). Параметры подключения к базе данных указываются там же в файле config.php.






 В не стандартном режиме ни один из тестов не прошел.
 В стандартном режиме ни один из тестов также не заработал.
Абсолютно все тесты (с первого по пятый) не были пройдены с замечательной ошибкой. Выполнение процедуры аутентификации загрузило на все 100% процессор (надо сказать, что производительность всех решений на базе http://www.openidenabled.com/openid/libraries/php) достаточна низка, но я полагаю, что под linux производительность должна возрасти (на такое суждение меня натолкнули несколько фраз в документации, но тестов под linux я не проводил). Так вот, после нескольких секунд ожидания соединение к серверу было сброшено, и я получил сообщение "The connection to the server was reset while the page was loading.".

Сервер номер 3



Теперь на операционный стол ложится сервер "my openIDOO". Загрузить его код можно из SVN репозитария "svn checkout http://openidoo.googlecode.com/svn/trunk/ openidoo".

Настройка сервера для работы также требует предварительных затрат и довольно сложных для новичков в веб-программировании. Одна из "порадовавших" меня вещей - подключение к базе данных (оно выполняется каждый раз заново во всех php-файлах, которые есть в составе библиотеки). К сожалению, в ходе тестов выяснилось, что в пару файликов скопировать тривиальные "mysql_connect" разработчики забыли - соответственно, часть скриптов не работала вообще. Ну а додуматься до вынесения строк подключения к базе в отдельный файл им, наверное, помешал сбой в ДНК.

Параметры подключения к БД (имя базы, пользователь и пароль) находятся в файле db.php. базу нужно предварительно создать и импортировать в нее содержимого файла openidoo.sql. Затем, если просто открыть страницу сервера, то получите сообщение об ошибке "Domain not found". Для того чтобы начать хоть что-то делать, нужно ручками добавить в таблицу openidoo_realm запись соответствующую именам тех доменов, которые будут обслуживаться этим сервером. Проще говоря, если я запустил openid-сервер по адресу http://openidoo/, то я должен добавить такую строку:
  1. mysql> INSERT INTO openidoo_realm (realm) VALUES ('openidoo');
  2. Query OK, 1 row affected (0.03 sec)
Также я скопировал содержимое папки E:\Program_Files_2\apache\home\openidoo\www\static\openidoo.com в папку

E:\Program_Files_2\apache\home\openidoo\www\static\openidoo

После чего на экране появилась следующая картинка.







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

Результаты тестирования:

Тест номер 1 пройден не был, сообщение об ошибке гласило: "OpenID authentication failed: Server denied check_authentication ".

Тест номер 2 также не был пройден, но с другим сообщение об ошибке: ERROR CODE: OPENID_NOSERVERSFOUND.

Попытка пройти тест номер три также завершилась неудачей: сообщение об ошибке гласило "Couldn't find OpenID Server".

Зато на удивление хорошо были пройдены тесты под номерами четыре и пять.

Сервер номер 4



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

Тест номер один пройден не был т.к. возникла ошибка:
  Fatal error: Call to undefined function SetupNeededResponse() 
  in путь_к_файлу\openid\www\Auth\OpenID\Consumer.php on line 717
Тест номер два был успешно пройден.

Тест номер три был также успешно пройден.

Тест номер четыре я пропускаю по очевидным причинам.

Тест номер пять не было пройден до конца: после отправки запроса на аутентификацию я попал в окно ввода пароля и указания того, какие данные (fio, nickname, email) разрешены для использования. Но вот затем на стадии подтверждения полученных данных от mediawiki к drupal-у возникла ошибка: "OpenID authentication failed (failure, Server denied check_authentication)."

Сервер номер 5



Это снова не автономный сервер, а плагин к wordpress. Посмотрим, чем нас обрадует.

Тест номер один был пройден успешно.

Тест номер два был пройден успешно.

Тест номер три пропускаю по понятной причине.

Тест номер четыре пройден успешно.

Тест номер пять был пройден.

Есть пара замечаний к прохождению. Откровенно говоря, я не нашел способа указать на страницу, принадлежащую конкретному зарегистрированному пользователю. Хотя, если открыть заглавную страницу wordpress, то обнаружатся openid-теги, но вот какому из пользователей они принадлежат ...? Первую ошибку я получил, когда пытался создать учетную запись в drupal без того чтобы быть одновременно с этой процедурой залогиненым внутри worddpress. Мне сообщили:
 You should login to verify OpenID identity.
 Couldn't verify OpenID identity.
Ладно, я зашел под именем зарегистрированного пользователя, но попытка повторной регистрации внутри drupal снова завершилась неудачей, с таким сообщением:
 You cannot verify this OpenID identity, try to use another one.
Вскоре я разобрался с тем, что подобное сообщение выводится для всех созданных записей, которые не наделены правами администратора wordpress-а.

Выводы: все дрянь.