Rocket.Chat SSO + плагин для встраивания

image

Краткое описание: Этот плагин интегрирует Rocket.Chat с Discourse.

Вам потребуется отдельный хостинг-экземпляр Rocket.Chat, например, от Communiteq, Digital Ocean или другого провайдера. Этот плагин обеспечивает интеграцию этого экземпляра с вашим форумом.

Интеграция состоит из двух частей:

  • Встраивание чата в пользовательский интерфейс Discourse
  • Единый вход (SSO) между Discourse и Rocket.Chat, где Discourse выступает в роли провайдера аутентификации для аутентификации, создания и обновления пользователей в Rocket.Chat.

:link: GitHub: GitHub - communiteq/discourse-rocketchat · GitHub
:arrow_right: Установка: Следуйте руководству по установке плагина.
:pray:t3: Благодарности: @jrgong предложил отличную идею интеграции Rocket.Chat с Discourse, а также разработал первую версию пользовательского интерфейса.

Скриншоты

Чат встраивается в правом нижнем углу интерфейса Discourse. Его можно свернуть и развернуть, нажав на заголовок окна. Чат остается открытым при навигации по форуму.

На мобильных устройствах чат отображается на весь экран и доступен через иконку Rocket.Chat в верхней панели:

Настройка

Интеграцию необходимо настроить на обеих системах. Discourse должен знать, где найти чат для его встраивания в интерфейс, а Rocket.Chat должен знать, где найти Discourse для возможности аутентификации.

На стороне Discourse

Администрирование - Плагины - Discourse RocketChat - Настройки

discourse_rocketchat_enabled
Включить или отключить плагин.

discourse rocketchat title
Здесь можно настроить заголовок окна чата, например, Чат.

discourse rocketchat host
Укажите имя хоста вашего экземпляра Rocket.Chat, например, chat.example.com.
Не добавляйте префикс https:// или подобное.

discourse rocketchat default channel
Здесь можно настроить канал по умолчанию, например, General.

discourse rocketchat min trust level
Укажите минимальный уровень доверия пользователей, чтобы они могли использовать Rocket.Chat, например, 2: member.

discourse rocketchat click entire bar
Включите эту опцию, если хотите, чтобы весь заголовок окна был кликабельным для разворачивания или сворачивания чата. Отключите, если кликабельными должны быть только текст «Открыть» и «Закрыть».

discourse rocketchat show menu for groups
Настройте группы, для которых Rocket.Chat должен отображать своё меню, например, staff.

На стороне Rocket.Chat

Администрирование - Настройки - CAS

Интеграция использует протокол CAS 2.0 для аутентификации и авторизации.

Замените forum.example.com на имя вашего форума.

  • Базовый URL SSO: https://forum.example.com/rocketchat
  • URL входа SSO: https://forum.example.com/rocketchat/login
  • Версия CAS: 2.0
  • Доверять имени пользователя CAS: включено
  • Разрешить создание пользователей: включено
  • Включено: включено

Администрирование - Настройки - CAS - Обработка атрибутов

Для синхронизации адреса электронной почты и полного имени необходимо настроить, где находятся эти атрибуты.

  • Всегда синхронизировать данные пользователя: включено
  • Карта атрибутов: {"email":"%email%", "name":"%name%"}

Администрирование - Настройки - Общие

Необходимо обеспечить возможность запуска Rocket.Chat в iFrame.

  • Ограничить доступ внутри любого Iframe: отключено

Администрирование - Настройки - Учётные записи

Для интеграции двух платформ Discourse должен контролировать вход, регистрацию, а также полное имя, имя и адрес электронной почты учётной записи. На стороне Rocket.Chat необходимо отключить следующие настройки:

  • Разрешить изменение аватара пользователя: отключено
  • Разрешить изменение имени: отключено
  • Разрешить изменение имени пользователя: отключено
  • Разрешить изменение адреса электронной почты: отключено
  • Показывать форму входа по умолчанию: отключено

Администрирование - Настройки - Учётные записи - Регистрация

  • Форма регистрации: отключено
  • Секретный URL формы регистрации: (случайная строка)

Администрирование - Настройки - Учётные записи - Аватар

Rocket.Chat может использовать аватары из Discourse.
Убедитесь, что вы заменили forum.example.com на имя вашего форума.

  • Внешний URL-адрес провайдера аватаров: https://forum.example.com/rocketchat/avatar/{username}.png
20 лайков

Я один из тех клиентов, у которых плагин работает уже давно, и это просто потрясающе!!!

Кстати, @RGJ, возможно, стоит добавить в заголовок темы, что это решение SSO + Embed для интеграции RC в ваш существующий экземпляр Discourse.

Если вы ищете жизнеспособную замену Babble Chat, то это именно то, что вам нужно!

9 лайков

Очень круто!

Одно замечание насчет URL аватара: использование этого URL не отобразит изображения для пользователей с аватарами по умолчанию (буквы на цветном фоне), только кастомные изображения или граватары. Может быть, кто-то знает другой URL, который включает все аватары? :slight_smile:

2 лайка

Это отличный момент, @DiscourseMetrics, спасибо.
Я не был осведомлен о таком URL, поэтому внедрил его в плагин. Теперь вы можете получить любую аватарку, используя https://forum.example.com/rocketchat/avatar/{username}.png, независимо от того, является ли она Gravatar, загруженным изображением или буквой.

5 лайков

Выглядит отлично! К сожалению, мой d-header исчезает, когда я включаю это. Есть какая-то идея, почему это происходит?

1 лайк

Хм… вы используете огромное количество компонентов темы, поэтому отладка без прямого доступа затруднена.

Я заметил, что использовал класс без префикса (.collapsible), который, скорее всего, вызывает конфликт, поэтому я добавил префикс к этому классу.

2 лайка

Спасибо, Ричард, к сожалению, это не сработало. Я также попробовал установить на одном из других своих сайтов, отключил все плагины и TC, но проблема всё ещё сохраняется, как вы можете увидеть здесь Exploring Exposure - Exploring Exposure Discussions

2 лайка

Я только что осознал, что разрабатывал и тестировал этот плагин только в ветке stable. Плагин выдаёт ошибку и падает в версии 2.8.x. Я займусь расследованием и исправлю это. Спасибо за ваш отчёт!

@davidkingham Я исправил проблему, не могли бы вы пересобрать и протестировать ещё раз?

4 лайка

Большое спасибо за этот плагин, он невероятно полезен!

Всего два момента:

  • Пока я тестирую только часть интеграции, связанную с встраиванием чата.
    Разрешает ли функция SSO плагина бесшовную интеграцию с автоматическим входом, или пользователю всё ещё нужно нажать кнопку входа через SSO, чтобы войти в Rocket.Chat (без ввода пароля)?
    В данный момент я сталкиваюсь с этой проблемой при интеграции SSO между Rocket.Chat и Nextcloud, и до сих пор не смог найти способ автоматического входа в Rocket.Chat без нажатия кнопки SSO.

  • Возможно ли настроить встроенный чат так, чтобы он открывался на главной странице Rocket.Chat, а не в канале по умолчанию?
    В настоящее время единственная возможность — задать канал по умолчанию, но было бы очень полезно, если бы встроенный чат также открывался на настраиваемой главной странице Rocket.Chat.
    (Я только что создал запрос на эту тему в репозитории на GitHub здесь, надеюсь, это никого не побеспокоит).

Ещё раз огромное спасибо за ваш ценный вклад!

1 лайк

Это решение используется в phpFox и называется ChatPlus. С его помощью можно перенести все сообщения из старого чата в Rocket Chat. Планируете ли вы добавить такую функцию?

Какой именно «старый чат» вы имеете в виду? Это звучит скорее как функция Rocket.Chat, чем как функция Discourse? Или я вас неправильно понял?

Установите этот скрипт как «Пользовательский скрипт для неавторизованных пользователей» в Rocket.Chat (обязательно замените имя хоста на имя вашего форума во второй строке). Примечание: я не проверял это недавно. Если это не сработает, я не уверен, что смогу вам помочь.

const credentialToken = Random.id();
const login_url = "https://discourse.example.com/rocketchat/login";

const appUrl = Meteor.absoluteUrl().replace(/\/$/, '') + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
const delim = (login_url.split('?').length > 1) ? '&' : '?';

var i = document.createElement('iframe');
i.style.display = 'none';
i.onload = function() { 
    Accounts.callLoginMethod({
        methodArguments: [{ cas: { credentialToken } }],
    });
};
i.src = `${ login_url }${ delim }service=${ appUrl }`;
document.body.appendChild(i);

Я займусь этим вопросом через несколько недель. Я оставлю задачу на GitHub открытой, чтобы не забыть об этом.

В phpfox есть функция переноса всех старых сообщений из нативного чата в Rocket.Chat (ChatPlus). Возможно ли реализовать это в Discourse, чтобы использовать только Rocket.Chat в качестве чата? Тогда все старые сообщения не будут утеряны, и этот плагин можно будет использовать на старых форумах, где уже накопилось много сообщений.

В Discourse нет встроенного чата, так откуда же будут поступать эти сообщения?
Кроме того, суть чата (в отличие от форума) заключается в том, что сообщения в чате более временные.

1 лайк

Я имею в виду личные сообщения.

А, понятно. В таком случае, нет.
Не уверен, что это действительно проблема, поскольку включение плагина Rocket.Chat всё равно позволяет это делать, даже при отключении личных сообщений:

2 лайка

Спасибо большое за ваш очень информативный ответ.
Ранее я видел скрипт, который вы опубликовали здесь, но думал, что он подходит только для аутентификации CAS, а не для SSO. Я попробую его и проверю, не блокирует ли браузер скрытое окно.

Большое спасибо! На мой взгляд, возможность устанавливать домашнюю страницу по умолчанию также во встроенном окне чата была бы очень интересным дополнением. С нетерпением жду её реализации, если у вас найдутся ресурсы, чтобы уделить этому время. Спасибо за рассмотрение возможности добавления этой опции.

Спасибо за ответ. Будет ли возможно использовать для чата Mattermost или MongooseIM вместо Rocket.Chat? Mattermost написан на Go, потребляет меньше ресурсов и более масштабируем. Или это возможно только с Rocket.Chat?

Нет, это плагин Rocket.Chat для Discourse…

Плагин использует протокол CAS 2.0 для реализации функционала SSO.

Можно ли переработать дизайн чата, чтобы он соответствовал форуму? Возможно ли это сделать с помощью CSS? Спасибо.

Отвечает ли это на ваш вопрос? https://developer.rocket.chat/guides/developer/ui-and-theming

1 лайк