Pull to refresh

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

Reading time 5 min
Views 2.7K
Начиная с 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, о чем будет висеть уведомление в администрировании провайдеров.
Tags:
Hubs:
+27
Comments 43
Comments Comments 43

Articles