Rocket.Chat Single Sign-On (SSO) + 嵌入插件

image

摘要:此插件将 Rocket.Chat 与 Discourse 集成。

您需要为 Communiteq、Digital Ocean 或其他提供商获取单独的 Rocket.Chat 托管实例。此插件将该实例与您的论坛集成。

集成包含两个部分:

  • 将聊天嵌入到 Discourse 用户界面中
  • Discourse 与 Rocket.Chat 之间的单点登录(SSO),其中 Discourse 作为身份验证提供商,用于在 Rocket.Chat 中验证、创建和更新用户。

:link: GitHubGitHub - 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
配置您的 RocketChat 实例的主机名,例如 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 替换为您论坛的名称。

  • SSO 基础 URLhttps://forum.example.com/rocketchat
  • SSO 登录 URLhttps://forum.example.com/rocketchat/login
  • CAS 版本:2.0
  • 信任 CAS 用户名:已启用
  • 允许创建用户:已启用
  • 已启用:已启用

管理 - 设置 - CAS - 属性处理

为了能够同步电子邮件地址和全名,我们需要配置这些属性的位置。

  • 始终同步用户数据:已启用
  • 属性映射{"email":"%email%", "name":"%name%"}

管理 - 设置 - 常规

我们需要能够在 iFrame 中运行 Rocket.Chat。

  • 限制在任何 Iframe 内的访问:已禁用

管理 - 设置 - 账户

为了集成这两个平台,Discourse 必须控制登录和注册以及账户的全名、用户名和电子邮件地址。您需要在 Rocket.Chat 端禁用以下设置:

  • 允许用户更改头像:已禁用
  • 允许更改名称:已禁用
  • 允许更改用户名:已禁用
  • 允许更改电子邮件:已禁用
  • 显示默认登录表单:已禁用

管理 - 设置 - 账户 - 注册

  • 注册表单:已禁用
  • 注册表单秘密 URL(某个随机字符串)

管理 - 设置 - 账户 - 头像

Rocket.Chat 可以使用 Discourse 的头像。
请务必将 forum.example.com 替换为您论坛的名称。

  • 头像外部提供商 URLhttps://forum.example.com/rocketchat/avatar/{username}.png
20 个赞

我是一位长期使用该插件的客户,它真的太棒了!!!

顺便一提 @RGJ,或许可以在主题标题中注明这是一个 SSO + 嵌入 解决方案,用于将 RC 集成到您现有的 Discourse 实例中。

如果您正在寻找一个可行的 Babble Chat 替代品,那这就是您的终极之选!

9 个赞

太棒了!

关于头像 URL 的一点说明:使用当前这个链接无法显示默认头像(彩色背景上的字母)用户的图片,仅能显示自定义图片或 Gravatar。不知道是否有人了解其他可以包含所有类型头像的 URL 呢?:slight_smile:

2 个赞

这是一个很好的观点,@DiscourseMetrics,谢谢。
我此前并不知道有这样的 URL,因此我在插件中内置了一个。现在,无论头像来自 Gravatar、上传的图片还是字母,你都可以通过 https://forum.example.com/rocketchat/avatar/{username}.png 获取任何头像。

5 个赞

这看起来很棒!但不幸的是,我启用这个功能后,d-header 就消失了,你知道是为什么吗?

1 个赞

嗯……你使用了海量的主题组件,因此如果没有实际操作权限,很难进行调试。

我注意到自己使用了一个未加前缀的类(.collapsible),这很可能导致冲突,所以我现在已经为该类添加了前缀。

2 个赞

谢谢理查德,遗憾的是那不起作用。我还在另一个网站上尝试安装,并禁用了所有插件和主题,但问题依然存在,正如您在此处所见:探索曝光 - 探索曝光讨论

2 个赞

我刚刚意识到,我仅针对 stable 分支开发和测试过此插件。该插件在 2.8.x 版本上会抛出错误并导致崩溃。我将进行调查并修复此问题。感谢您的报告!

@davidkingham 我已修复该问题,能否请您重新构建并再次测试?

4 个赞

非常感谢您提供这个插件,它非常有用!

只有两点疑问:

  • 目前我仅测试了集成中的聊天嵌入部分。该插件的 SSO 功能是否支持与自动登录的无缝集成?还是说用户仍需点击 SSO 登录按钮才能登录到 Rocket.Chat(无需输入密码)?
    目前我在 Rocket.Chat 与 Nextcloud 之间的 SSO 集成中遇到了这个问题,至今尚未找到无需点击 SSO 按钮即可自动登录 Rocket.Chat 的方法。

  • 是否可以将嵌入的聊天设置为在 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 个赞

我的意思是私信。

啊,我明白了。那样的话,不行。
我不确定这是否真的是一个问题,因为即使禁用了私信(PM),启用 Rocket.Chat 插件仍然允许这样做:

2 个赞

非常感谢您详尽的回复。
我之前看到过您发布的脚本 此处,但当时我以为它仅适用于 CAS 认证,而不适用于 SSO。我会尝试一下,并检查浏览器是否会阻止隐藏窗口的打开。

太感谢您了!在我看来,让嵌入式聊天窗口也能默认显示主页将是一个非常有趣的补充。如果您未来能抽出时间实现这一功能,我非常期待看到它的落地。感谢您考虑添加此选项。

谢谢回复。是否可以使用 Mattermost 或 MongooseIM 来替代 Rocket.Chat 进行聊天?Mattermost 是用 Go 语言编写的,资源占用更少,扩展性也更强。还是说只有 Rocket.Chat 才能实现这一功能?

不行,这是 Discourse 的 Rocket.Chat 插件……

该插件使用 CAS 2.0 协议来实现 SSO 功能。

能否重新设计聊天界面以适配论坛?是否可以通过 CSS 实现?谢谢。

这是否解答了您的疑问?https://developer.rocket.chat/guides/developer/ui-and-theming

1 个赞