Всем конечно приходилось сталкиваться с необходимостью делать на сайте аутентификацию через социальные сети, твиттер и другие сервисы. Для этой задачи есть готовые модули, которые по-отдельности отлично работают. Но как только требуется поддержка нескольких систем, начинаются проблемы, так как эти модули работают немного по-разному и иногда вообще друг другу мешают. Для решения этой проблемы Drupal -сообщество давно обсуждало идею единого модуля аутентификации. Теперь такой модуль есть. Он называется Multilogin.
Drupal изначально поддерживает аутентификацию через внешние системы, в поставку входит модуль OpenID . Чтобы работать с пользователем вне зависимости от того каким способом он аутентифицирован, Drupalсоздает для каждого локальный аккаунт, с которым работает непосредственно. В случае OpenID - если провайдер отдает достаточно информации для регистрации пользователя, то Drupal аккаунт для него создается автоматически. Иначе пользователю которого уже аутентифицировали все равно приходится заполнять регистрационную форму. Эта неудобно для пользователей, но иногда необходимо для сайта. Так или иначе, пользователь оказывается зарегистрирован. Инфо рмация о связи его внешней айдентити и Drupal аккаунта хранится в таблице authmap. Далее, если пользователь приходит с уже известным нам айдентити, по этой записи мы его аутентифицируем и пускаем без лишних вопросов . В профиле пользователь может добавить любое количество OpenID-аккаунтов, которые будут ассоциированы с его аккаунтом Drupal. Логично что модуль единой аутентификации через соцсети должен работать примерно по тому же принципу, с оглядкой на то что для каждого провайдерами аутентификации может быть собственная имплементация той части, где происходит непосредственно взаимодействие.
Архитектурно multilogin это один модуль с набором плагинов ― модуль отвечает за общий принцип работы, управление списком связанных внешних аккаунтов пользователя. работа с плагинами как с инклудами, а не как с самостоятельными модулями позволяет загружать их только в тот момент, когда они действительно нужны ― то есть непосредственно в момент взаимодействия с внешней системой. Информацию о соотвествии внешних профилей аккаунтам Drupal Multilogin хранит в таблице authmap. Информация о профилях во внешних системах хранится просто в сериализованом виде ― потому что структуры данных у всех соцсетей различаются,
Вопрос с регистрацией в один клик и необходимостью получения полной информации от пользователей оставлен на усмотрение администратора и регулируется настройками. Не секрет, что не все системы отдают мейл пользователя ― в режиме быстрой регистрации это можно игнорировать. При этом возможно назначение дополнительной роли тем пользователям, у которых мейл не указан. Общий принцип работы плагинов провайдеров аутентификации Так, при попытке аутентификации через любую из внешних систем если она предоставляет email пользователя, и на сайте есть аккаунт с этим мейлом ― пользователь аутентифицируется как обладатель этого аккаунта. Если такого мейла на сайте еще нет, делается попытка создать нового пользователя. Далее в обычном режиме модуль работает по тому же принципу что и OpenID ― если информации недостаточно - пользователь отправляется заполнять регистрационную форму.
В режиме быстрой регистрации создание нового аккаунта происходит сразу, а недостающие поля просто оставляются пустыми.
С писок полей и принцип их заполнения можно изменить через hook_multilogin_create_user ― например сразу заполнить в пофиле дату рождения и ФИО данными из соцсети. Можно менять набор хранимых полей для каждой из систем или способ конструирования уникального логина пользователя. (Пример есть в документации) Multilogin также может хранить информацию для авторизации во внешних системах, само взаимодействие будет реализовано через отдельные модули. Пока есть только модуль, который публикует анонс создаваемой ноды в twitter.
Что сейчас есть: - сам multiogin - плагины для: vkontakte (для старой системы авторизации Open API, будет переписан soon) facebook twitter - модуль для постинга в twitter
Сейчас модуль доступен на github, Планируется выложить на drupal.org после того как будут функции, которых в других модулях нет - так как сейчас он по сути дублирует функциональность уже существующих модулей, его не зааппрувят.