Интеграция Liferay и WSO2 IS через протокол OpenId

Есть задача - организовать единую точку входа (SSO)  используя WSO2 Identity Server (WSO2 IS)  и подключить к ней Liferay. В случае если используется Liferay Enterprise Edition - никаких проблем нет - для него есть плагин поддержки SAML 2.0 и данную задачу можно решить используя протокол  SAML. Но что делать если у нас Community Edition.

Тут все хуже - к сожалению "из коробки" есть только поддержка протокола OpenID - и тут мы рассмотрим как можно реализовать логин в портал Liferay используя этот протокол.

Конфигурация WSO2 IS для поддержки OpenID

Рассмотрим на примере нашего демо-стенда https://wso2demo.emdev.ru:19443. Для того, чтобы сервер IS правильно обрабатывал запросы, необходимо настроить его на использование правильного доменного имени. Для этого открываем файл <wso2is>/repository/conf/identity.xml и редактируем часть, отвечающую за OpenID:

        <OpenID>
                <OpenIDServerUrl>https://wso2demo.emdev.ru:19443/openidserver</OpenIDServerUrl>
                <OpenIDUserPattern>https://wso2demo.emdev.ru:19443/openid/</OpenIDUserPattern>

Тут надо указать используемый домен и порт.

Установка сертификата

Для того, что бы портал Liferay мог взаимодействовать с OpenID сервером WSO2IS по https, необходимо добавить его сертификат в cacerts. Для этого я экспортировал сертификат в файл wso2demo.emdev.ru.crt (например кликнув на https в браузере Firefox, получив информацию о сертификате и нажав Экспорт) и добавил его в cacerts JRE используя утилиту keytool . У меня на MacOS X это можно сделать командой

#sudo keytool -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/security/cacerts \
              -importcert -alias wso2demoemdevru -file ~/Downloads/wso2demo.emdev.ru.crt

Если вдруг кто-то не знает - пароль к cacerts - changeit

Логин из портала Liferay используя OpenID

Поддержка OpenID включена в портале Liferay по умолчанию. Если нет - то идем Control Panel -> Portal Settings -> Authentication -> OpenID и включаем.

В Результате, в портлете Login будет доступна ссылка - "OpenID". При клике на нее попадаем в окно  входа по OpenID

Тут надо ввести урл на OpenID провайдер - причем в нем указать имя пользователя, которым мы хотим залогинится. В моем случае это был https://wso2demo.emdev.ru:19443/openid/akakunin

После нажатия на кнопку "Sign In" мы попадем в окно входа в WSO2 IS, причем так как имя пользователя мы уже указали в URL -  то у нас спросят только пароль

После ввода пароля будет спрошено разрешение о предоставлении внешнему приложения данных о пользователе. Передается только имя пользователя

Дальше управление будет передано обратно порталу. Так как полученных данных не достаточно для того, что бы создать нового пользователя, портал предложит создать нового в форме Регистрации. Однако, если указанный openID URL (https://wso2demo.emdev.ru:19443/openid/akakunin в моем случае) заранее присвоить одному из пользователей портала (Control Panel -> Users and Organizations -> user -> таб OpenID) то будет осуществлен вход указанным пользователем.

ИТОГО

Итого грусно. Конечно организовать SSO между Liferay CE и WSO2 IS можно через OpenID - но практической ценности такой способ никакой не несет:

  • Никто не будет помнить свой OpenID URL
  • Нет возможности автоматически создать пользователя
  • Как итог - указанный OpenID URL надо заранее задавать заранее созданным пользователям портала.

В этом плане интеграция через SAML 2.0 выглядит значительно предпочтительней.