将 IM 聊天服务器集成到现有 Spring 服务器

Posted

技术标签:

【中文标题】将 IM 聊天服务器集成到现有 Spring 服务器【英文标题】:Integrate an IM chat server to existing Spring server 【发布时间】:2017-03-08 09:42:17 【问题描述】:

我正在尝试将 openFire XMPP 服务器集成到我当前公司的 Spring 服务器,但有两个主要问题我找不到答案 -

我将首先从我当前的架构开始 - 1. xmpp 服务器有一个独立于 Spring 服务器 DB 的自己的 DB-server,这是一个专用的机器来保存用户的字符历史等 2. Spring 服务器有一个自己的数据库,用于保存用户凭据(md5 加密)以及客户端应用程序数据 3. spring server 专用于服务 HTTP 请求(一个专用的 REST server)

总而言之,我有 2 个 DB 服务器,一个是聊天服务器,一个是 Rest 服务器

现在回答问题 - 1.我可以禁止注册到xmpp服务器(即将其余服务器ip列入白名单,并让它成为用户注册后唯一可以创建用户的人)吗? 2.出于安全原因,Rest 服务器每 2 天为登录用户切换一次会话,iosandroid 客户端在本地处理会话管理 - 我如何将这些会话与 XMPP 服务器一起使用? 澄清一下 - 我希望用户能够将 xmpp 服务器仅用于聊天目的,但只有在他们登录到应用程序本身之后才能使用,因为用户会话可能会过期,聊天客户端还必须针对 REST 服务器重新进行身份验证,如何我能做到吗? 3. 它不会在 REST 服务器上造成过载吗? (即,Rest 服务器现在必须处理客户端请求以及 XMPP 服务器请求) 4. 实现这种系统(聊天服务器,聊天服务器的数据库服务器,休息服务器,休息服务器的数据库服务器)的最佳架构是什么,以便系统可以水平扩展?

我在 Google 上搜索了一篇文章或与描述一般架构相关的内容,但找不到任何相关内容,因为我不是在这里“发明***”,我很想听到一个好的建议或被定向到一篇文章这解释了操作方法

提前致谢。

【问题讨论】:

【参考方案1】:

XMPP 世界中用户身份验证的标准方式是SASL。

SASL 有一个非常简单的模型:服务器向客户端发送一些“挑战”字符串给客户端,客户端向服务器发送“响应”字符串,它们重复此过程,直到服务器决定客户端发送所有需要的数据。 SASL“机制”中定义了要发送的数据。有许多众所周知的 SASL 机制,例如SCRAM,它们由大多数 XMPP 服务器和客户端“开箱即用”提供。

您的问题是 - 您已经拥有身份验证系统和用户数据库,并希望将其重用于聊天目的。有两种方式:

将您的自定义 REST 身份验证作为 SASL 模块添加到您的服务器。 Google say 已经可以编写和添加 Openfire SASL 插件。您的 SASL REST 机制将执行与浏览器相同的操作,但所需的 url、令牌等将被包装为“挑战”和“响应”,例如服务器会将 REST auth url 作为“挑战”发送给客户端,客户端将打开 url、发布凭据、获取令牌并将它们作为“响应”发送回服务器。当然你也需要在客户端添加这个 SASL REST 机制。 采用您的 XMPP 服务器直接使用您的身份验证数据库。在这种情况下,您只需要修改 Openfire 代码以将其与您的用户/密码表链接(也许已经有一个管理工具)。在这种情况下,客户端将继续使用标准 SASL 机制而无需修改。如果这种方式可能比第一种方式更容易,请记住您的 XMPP 服务器应该可以访问纯文本密码,这可能是不安全的。

按顺序提问:

    是的,您可以禁用 XMPP 客户端的注册并将用户指向注册网站。

    您将在 Openfire 管理控制台中看到聊天会话并能够停止它们,您也可以根据您的日程安排编写一个模块来执行此操作

    如果您将编写 SASL REST 机制,那么来自聊天客户端和 Web 客户端的 REST 后端请求之间没有任何区别,它们看起来是一样的。

    正如我首先描述的,您不需要单独的聊天服务器数据库,并且您可以设置多个连接到您的 REST 后端的聊天服务器。

【讨论】:

非常感谢您的回答!

以上是关于将 IM 聊天服务器集成到现有 Spring 服务器的主要内容,如果未能解决你的问题,请参考以下文章

环信IM集成指南Web端常见问题整理

环信IM集成指南Web端常见问题整理

微信小程序集成腾讯云 IM SDK

融云im小程序集成初体验

XMPP Spring 集成 - 聊天

IM服务器:一个使用imserver服务器进行聊天的web端案例