войти зарегистрироваться

Drupal whois

индекс
128,53

OpenID с человеческим лицом в Drupal

Начиная с 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)

  • Отличный модуль, как раз то что надо и как раз во время :) Спасибо!

    А что за модуль, который делает такую админку?
  • Drupal 6.14
    закачиваю модуль в modules, активирую… после этого сайт перестает работать — в браузере чистый лист:(
    лечится тупым удалением модуля…
    может кто, что подскажет?
    модуль OpenID само собой установлен и активирован
    • Для начал апроверить display_errors — возможно просто отключено оповещение об ошибках.
      Самое простое — в index.php друпала добавить в самом начале ini_set('display_errors', 1); и смотреть что будет выдаваться.

      Есть подозрение на то, что у вас установлен пхп4 — сам друпал на него нормально встает, но модуль требует пхп5. Допишу ограничение по версии пхп в инфо.
  • добавил ini_set('display_errors', 1);

    При заходе в «Управление сайтом» выдаёт:

    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
    • PHP дейстительно 4 :(
      под 4 версию модуля не будет?:(
      • Вобще, для того чтобы сделать модуль совместимым с пхп4 достаточно удалить 1 слово — именно то, которое кидает ошибку: в inc/openid_ext.routines.inc в строке 79 заменить
        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/ — цсс там есть, проблема в яваскрипте — почему-то он у вас не отрабатывает как нужно. Нужно разбираться. Вечером постараюсь посмотреть.
                • krig, огромное спасибо за помощь! с меня анонс плагина на сайте;)
                  • Попробуйте забрать обновление itskrig.com/sites/default/files/openid_ext-0.6.5.zip
                    Насколько понял у вас не отработала тема «Accordion», а вот почему — пока понять не могу. Для начала попробуйте почистить кэш, если не поможет — будем разбираться дальше.
                    • krig, жму руку! загвоздка действительно была в кэше
  • Придумал русский аналог слова «законтрибучен» — «закоммичен». Потом подумал, что что-то тут не так :)

    Спасибо вам! В правильном направлении развиваете Drupal!
  • очень полезная тема. ждем релиза на дру.
  • а нету ли возможности посмотреть, почему Drupal не дружит с OpenID от Chi.mp?
    • Можно попробовать расковырять друпальский OpenID и посмотреть в какой момент он отдает ошибку. Так же докопался до причины ошибки с гуглом. Вечером постараюсь разобраться.
    • А вы пробовали логиниться со своего mp домена? Насколько я понял сам по себе chi.mp не является провайдером, только личные домены типа bob.mp
      • да, конечно
        • Наконец-то прошел все шаги и зарегался там =)

          OpenID-авторизация работает отлично — даже забрались ник и мыло, когда дал уровень доступа Friend.

          Подозреваю что у вас такая же проблема, как и у тех, кто не может авторизоваться через гугл — пхп собран без поддержки openssl, поэтому все провайдеры, с авторизацией через https работать не будут, и chi.mp в их числе.

          Думаю имеет смысл добавить предупреждение об этом в админку, если админ попытается активизировать провайдеры с авторизацией через https при отсутствии поддержки openssl, а так же добавить chi.mp в качестве провайдера, для упрощения процедуры авторизации.
  • 1. Какой-то бардак с названием: в статье есть «Extenisions», в ссылке — «exensions», а должно быть, насколько я понимаю, «Extensions»? :)
    2. Пожалуйста, все модули и в любом состоянии выкладывайте на drupal.org, пусть даже будет -alpha-dev-nightly релиз :)
    • Сорри, второе уже не актуально :)
    • Спасибо. Пoправил везде где нашел =)
      Оказалось что написав 1 раз неправильно потом везде растираживал слово Extensions с пропущенной буквой
  • Проблема с openid в друпале давно ждет человеческого решения, да. Спасибо вам.
  • так бы на любом портале, ко всему этому еще live id, и вообще замечательно.
    • Введение дополлнительной сущности не нужно, ибо Windows Live ID Becomes an OpenID Provider.
      Достаточно просто дописать несколько строк кода в модуль и все должно заработать =) Этим и займусь, но немного попозже.
  • Давно пора всем понять, что лучший openid идентификатор — это существующий email. Никто не хочет запоминать и придумывать что-то ещё, и email провайдеры должны это понять. Гугл это уже давно понял и сам активно продвигает, несколько месяцев назад подключил к openid даже емейлы, созданные на доменах google for domains
    Никому не нужна вся эта каша из логотипов провайдеров, запросов логинов и прочей херни. У людей уже есть емейл, и всё, больше им ничего не надо.
    Читаем исследования, предложенные пути на sites.google.com/site/oauthgoog/UXFedLogin/emailonlylogin
  • 15 января 2010, сайт лежит, на друпал.орг тишина. где модуль то качать??
    • На друпалорге модуля не будет.
      Сайт пока лежит — небольшие трудности.
      Последняя версия модуля.
      • спасибо, пошел ковырять
      • Кстати, почитал ваши «борения» на тему размещения модуля — это реально жесть! Мозг вынесли конкретно. При том что на сайте — куча древних и дурацких модулей…
        • Первое время было очень обидно, а теперь уже все равно — проект, для которого предназначался модуль, уже запущен. А бороться c модераторами опенсорс проекта нет никакого желания и смысла.
          • Ну, бороться, ясное дело, не надо — себе дороже. :-) Но пофигизм и какое-то недружелюбие со их стороны несколько покоробило… Я, например, несколько портов во FreeBSD поддерживаю, ну так там народ хоть и тормозной на редкость, но хотя бы дружелюбный более-менее. :-)
            А модуль ваш сейчас поковыряю и может тоже на проект друпаловский прикручу…
            • Если соберетесь прикручивать модуль — советую еще посмотреть на мой же патч для модуля OpenID — с ним гугловый OpenID отрабатывает нормально (забирает мыло и делает из него юзернейм).
              • Мммм… Ну я как раз за последние полчаса проглядывал в репозитории модули, связанные с OpenID — там насчет AX несколько штук уже нашел — отложил в сторонку для изучения. :-)
                Зачем патчить ядерный модуль, если можно просто дополнительные использовать? Или там бонусы какие-то есть, которых дополнительными достичь нельзя?
                • Я не нашел хуков для модификации запроса, отправляемого провайдеру, и видел 2 пути исправления — либо писать модуль, который будет работать поверх ядерного, заменяя часть его функционала на «правильный», ну или написать небльшой патч. Как-то так получилось что выбрал именно второй путь, хотя и знаю что heyrocker.com/hack_core.jpg =)
                  • Дошли сейчас руки посмотреть содержимое drupal.org/project/openid_client_ax
                    Так вот, он пользует некий hook_openid, который ни хрена не описан в документации на API (я его в начале тоже не нашел), но присутствует внутри функции openid_authentication_request: api.drupal.org/api/function/openid_authentication_request/6
                    Вообще, если не видели, то посмотрите вот это: groups.drupal.org/node/21221
                    И ссылочки оттуда. Там народ достаточно плотно OpenID занимается — возможно, лучше всего будет с ними повзаимодействовать, чем стену из нешарящих в теме людей долбиться… Возможно, они и модуль из топика примут с радостью. :-)
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.