Начиная с 6 версии Drupal, в комплекте с системой идет модуль OpenID, который обеспечивает авторизацию через OpenID протокол. Но у модуля есть довольно серьезные проблемы. В частности, сам модуль реализует
антипаттерн, описаный Иваном Сагалаевым в своем блоге. Вторая проблема модуля, с точки зрения юзабилити — это непрозрачная авторизация по OpenID, а если быть точнее, то при первой попытке авторизации через некий OpenID аккаунт, система просит заполнить некоторое количество полей.
В общем, ничего сильно страшного в заполнении небольшого количества полей лично я не вижу (тем более что в некоторых случаях часть полей заполняется автоматически, но об этом чуть ниже) — причиной этому является архитектура Drupal. OpenID аккаунты привязаны к реальным Drupal-акаунтам, т.е. при успешной авторизации у OpenID-провайдера Drupal пытается найти соответствие OpenID-аккаунта Drupal-аккаунту. Если такое соответствие не найдено — система предлагает зарегистрировать новый аккаунт, для чего необходимо заполнить некоторое количство обязательных полей — в общем случае это уникальное имя пользователя в системе и адрес электронной почты. Если же соответствие найдено — пользователь авторизуется. В профиле пользователь может добавить любое количество OpenID-аккаунтов, которые будут ассоциированы с его Drupal-аккаунтом.
С принципом работы OpenID в Drupal все более-менее понятно. Но вопросы к юзабилити никуда не делись — ссылочку внизу блока авторизации никак не назвать очень удобным решением. В посте в блоге Ивана, о котором я писал выше, был представлен один из возможных прототипов решения данной проблемы, реализацией для Drupal которого я и занялся.
Как и что писалось — думаю в данном случае это не имеет особого значения — в конце концов все распространяется в виде исходных кодов. Перейдем непосредственно к сути — что получилось =)
А получилась система, позволяющая при помощи некоего набора API подключать дружественную (насколько у меня это получилось) поддержку определенных OpenID-поставщиков, плюс, добавил дополнительную фичу в виде подключаемых тем оформления блока.
Немного подробней обо всем, и с картинками =)
Думаю что про то, как устанавливаются модули в Drupal, рассказывать не нужно, а если нужно, то советую ознакомиться с
моей предыдущей статьей, где я описывал основы работы с этой системой. Поэтому просто
скачиваем модуль OpenID Extenisions и устанавливаем его (обратите внимание, что он зависит от модуля OpenID). Теперь можно заняться его настройкой.
Идем в
User management ->
OpenID Extensions и попадаем в настройки OpenID провайдеров.
В настройках (функционирование которых я скопировал с модуля
Blocks =)) можно подключить/отключить доступных провайдеров, а также задать им порядок следования. Последнее удобно в том случае, когда вы знаете, что большинство OpenID авторизаций на вашем ресурсе идет, например, с LiveJournal — тогда ставил LJ на первое место и он будет выбран по умолчанию при загрузке страниц, на которых блок отображается. Также там можно найти вкладку
Themes, перейдя на которую вы увидите список доступных тем. Темы определяют внешний вид формы OpenID-авторизации. В базовой поставке (а другой на момент написания этого поста в блоге и не существует =)) идет 2 темы:
Выбрав понравившуюся тему оформления и настроив OpenID-провайдеры можно перейти в настройки блоков (
Site building ->
Blocks), добавить блок под названием
OpenID Extensions в нужный регион, выставить его позицию и, если требуется, настроить фильтр показа блока на страницах. Настраивать фильтр видимости по ролям нет никакого смысла — в любом случае блок виден только неавторизованным пользователям.
После успешной авторизации у OpenID-провайдера, при первой попытке входа, как я уже писал выше, Drupal перенаправляет пользователя на страницу регистрации, где пытается заполнить поля формы значениями, полученными от провайдера. Если у OpenID-провайдера реализован SRE (Simple Registration Extension) и необходимые поля в вашем профиле заполнены, то эти поля на форме регистрации заполняются автоматически. Например, в моем аккаунте на Яндексе заполнена вся необходимая информация — при попытке авторизации Яндекс спросил хочу ли я разрешить авторизацию для ресурса example.com и разрешаю ли я передать этому ресурсу 2 поля — Псевдоним и Email. Если процедура регистрации завершается успешно в автоматическом режиме (т.е. все необходимые данные получены и они успешно проходят валидацию), то для пользователя заводится Drupal-аккаунт, к которому автоматически привязывается OpenID-идентификатор и пользователь автоматически входит в систему.
В случае если нужные данные не заполнены, либо провайдер не предоставляет таких данных (например Google, который не реализует SRE, а только AX, не поддерживаемый модулем
OpenID в Druapal) система выдаст ошибку и попросит ввести недостающие поля вручную. Так же, если OpenID-провайдер не предоставляет Псевдоним, то поле «Имя пользователя» заполняется значением OpenID-идентификатора. Для решения этой проблемы модуль предоставляет небольшой обходной путь, но работает он только для определенных провайдеров — в базовой поставке только с LiveJournal и Yandex. Вобще, патчингом модуля
OpenID мне удалось получить адрес электропочты от Google, поэтому в будущем думаю немного расширить функционал модуля, и для некоторых провайдеров написать свои собственные обработчики, которые должны будут подменить стандартные. Еще в планах было приложить руку к модулую
OpenID, входящему в состав Drupal 7, который недавно вошел в режим заморозки функционала. Ну а пока работает так, как работает.
Так же необходимо отметить, что модуль
OpenID Extensions «подчищает» кое-какие моменты за модулем
OpenID, а именно удаляет ссылки с форм логина (в блоке и на отдельной странице), переключающие эти формы в режим OpenID-авторизации — поведение стандартного модуля повторяет провайдер
Any OpenID, который включен по умолчанию при установке модуля.
Вот вобщем-то и все, что я собирался рассказать про улучшение юзабилити OpenID-авторизации в Drupal. Модуль пока что
можно скачать только у меня на сайте в разделе
Проекты. После того как модуль будет немного подчищен, он будет законтрибучен (не могу придумать русский аналог этого слова) на
drupal.org, о чем сообщу дополнительно.
Ну и напоследок небольшая интрига — данный модуль изначально разрабатывался для проекта, который должен увидеть свет в ближайшее время. Анонс проекта обязательно будет опубликован =)
Теперь точно все =) Жду в каментах отзывы/багрепорты/предложения/пожелания.
ЗЫ в настоящее время существуют некоторые проблемы с отображением оформления
Accordion в некоторых темах Drupal. В частности, оформление не совсем корректно работает с темой
LightWord.
UPD: В настоящее время модуль проходит стадию code review на
drupal.org.
UPD2: Для тех кто получает ошибку при попытке залогиниться гуглом — гугл использует https, поэтому PHP должен быть собран с поддержкой OpenSSL (в убунте достаточно поставить пакет openssl, если не ошибаюсь).
UPD3: обновил до версии 0.6.5, в ней:
— добавил новый провайдер 'Chi.mp'
— добавил возможность делать проверку доступности провайдера
— реализовал проверку для google и chi.mp — теперь и тот и другой не доступны, если нет поддержки openssl, о чем будет висеть уведомление в администрировании провайдеров.
комментарии (39)
А что за модуль, который делает такую админку?
закачиваю модуль в modules, активирую… после этого сайт перестает работать — в браузере чистый лист:(
лечится тупым удалением модуля…
может кто, что подскажет?
модуль OpenID само собой установлен и активирован
Самое простое — в index.php друпала добавить в самом начале ini_set('display_errors', 1); и смотреть что будет выдаваться.
Есть подозрение на то, что у вас установлен пхп4 — сам друпал на него нормально встает, но модуль требует пхп5. Допишу ограничение по версии пхп в инфо.
При заходе в «Управление сайтом» выдаёт:
Parse error: parse error, unexpected T_ARRAY, expecting ')' in /var/www/vhosts/openkazan.info/httpdocs/modules/openid_ext/inc/openid_ext.routines.inc on line 79
под 4 версию модуля не будет?:(
function openid_ext_write_cache_styles(array $styles, $cache_css) {на
function openid_ext_write_cache_styles($styles, $cache_css) {и все должно завестить на пхп4.
Думаю все-таки внесу это изменениев модуль.
единственное — красивые значки OpenID-провайдеров не показываются в меню. попробывал обе темы
Там создается временная css со стилями с иконками. Если настройки дефолтные, то /sites/default/files/openid_ext.providers.css. Есть такой файл?
даже папки files то не было
папку создал права 777 дал
как openid_ext.providers.css создать? сам уже не создается
Если я правильно понял из текста ошибки, то ваш сайт openkazan.info/ — цсс там есть, проблема в яваскрипте — почему-то он у вас не отрабатывает как нужно. Нужно разбираться. Вечером постараюсь посмотреть.
Насколько понял у вас не отработала тема «Accordion», а вот почему — пока понять не могу. Для начала попробуйте почистить кэш, если не поможет — будем разбираться дальше.
Спасибо вам! В правильном направлении развиваете Drupal!
OpenID-авторизация работает отлично — даже забрались ник и мыло, когда дал уровень доступа Friend.
Подозреваю что у вас такая же проблема, как и у тех, кто не может авторизоваться через гугл — пхп собран без поддержки openssl, поэтому все провайдеры, с авторизацией через https работать не будут, и chi.mp в их числе.
Думаю имеет смысл добавить предупреждение об этом в админку, если админ попытается активизировать провайдеры с авторизацией через https при отсутствии поддержки openssl, а так же добавить chi.mp в качестве провайдера, для упрощения процедуры авторизации.
2. Пожалуйста, все модули и в любом состоянии выкладывайте на drupal.org, пусть даже будет -alpha-dev-nightly релиз :)
Оказалось что написав 1 раз неправильно потом везде растираживал слово Extensions с пропущенной буквой
Достаточно просто дописать несколько строк кода в модуль и все должно заработать =) Этим и займусь, но немного попозже.
Никому не нужна вся эта каша из логотипов провайдеров, запросов логинов и прочей херни. У людей уже есть емейл, и всё, больше им ничего не надо.
Читаем исследования, предложенные пути на sites.google.com/site/oauthgoog/UXFedLogin/emailonlylogin
Сайт пока лежит — небольшие трудности.
Последняя версия модуля.
А модуль ваш сейчас поковыряю и может тоже на проект друпаловский прикручу…
Зачем патчить ядерный модуль, если можно просто дополнительные использовать? Или там бонусы какие-то есть, которых дополнительными достичь нельзя?
Так вот, он пользует некий hook_openid, который ни хрена не описан в документации на API (я его в начале тоже не нашел), но присутствует внутри функции openid_authentication_request: api.drupal.org/api/function/openid_authentication_request/6
Вообще, если не видели, то посмотрите вот это: groups.drupal.org/node/21221
И ссылочки оттуда. Там народ достаточно плотно OpenID занимается — возможно, лучше всего будет с ними повзаимодействовать, чем стену из нешарящих в теме людей долбиться… Возможно, они и модуль из топика примут с радостью. :-)