如何在已注册用户的网站上完全集成XMPP

16
我们有一个社交网络网站,用户可以添加联系人,我们希望将其与XMPP集成。 我们目前使用ejabberd XMPP服务器。
以下是我的问题:
1. 如何正确创建帐户?现在,我正在考虑在用户注册我们的Web应用程序时,调用一个脚本来执行ejabberd命令以创建用户。 2. 用户认证。在用户登录我们的网站时,用户将自动登录聊天系统。如何在客户端使用strophe.js完成此操作?据我所知,您需要提供JID和密码进行身份验证,因此我想,在登录时,将进行一个ajax调用以获取用户的密码,然后在strophe.js的登录调用中使用响应文本。这是安全的吗?还有其他方法吗? 3. 在线状态注册。我们的Web应用程序有一个联系人系统,但XMPP通过订阅在线状态有自己的添加联系人方式,对吧?例如:当用户1尝试添加用户2时,必须经过用户2的授权才能将用户1添加为用户2的联系人。但是,由于我们已经在我们的Web应用程序中拥有了联系人系统,我们希望绕过XMPP的此类授权或抑制它,并在用户2在我们的网站上确认用户1为联系人时,使用脚本/命令进行授权。我还不确定,但同事说这在ejabberd的模块mod_admin_extra上是可能的(一种无需客户端授权即可创建订阅的命令)。这是可能的吗?还是我必须使用脚本手动操纵ejabberd数据库(假设我从默认的Mnesia数据库转移到另一个数据库,比如MySQL)。
提前感谢。
2个回答

10
我们(superfeedr)有一个类似的Web应用程序,其中XMPP是应用程序的一部分。
我们做出的选择是不在Web应用程序存储和XMPP服务器之间复制用户数据。您可以使用Web应用程序的数据存储构建自己的authentication mechanism,并与ejabberd一起使用,这很容易。这样,您只需要一个单独的地方来存储用户数据,而不必创建ejabberd用户。
通过这样做,您还可以在不知道用户密码甚至不以明文形式存储密码的情况下登录用户的Web应用程序 :) 。简单的方法是在服务器上通过Bosh进行会话认证,并将会话ID传递给HTML响应,如@metajack所述described here
第三部分可能是最棘手的,但我确信您可以绕过此步骤而不使用内置的“rosters”...但这可能涉及创建自己的组件(内部或外部)。

嗨,朱利安,我已经阅读了使用外部认证的内容,但我想我还没有深入阅读。一开始我对你的回答感到困惑,因为在这个示例PHP脚本(http://www.ejabberd.im/files/efiles/check_mysql.php.txt)中,没有任何东西可以捕获到这里提到的用户创建(https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/doc/dev.html#htoc8)。在第3项中,我仍在搜索admin_extra模块,一旦我找到了什么,我会更新的。 - putolaruan
哎呀。昨晚睡前我终于明白为什么我不需要使用外部认证创建Jabber用户了。现在唯一剩下的障碍是花名册功能。 - putolaruan
很好!你可能需要创建自己的组件。这并不难,所以我建议你试一试。你可以用任何语言创建一个“内部”或“外部”组件(推荐使用外部组件)! - Julien Genestoux
实际上,团队决定采用内部认证,因为我们没有太多时间,也没有太多资源来从外部认证中获取信息以进行自己的值班表实现。我们决定采用内部认证,并使用mod_admin_extra模块创建值班表。 - putolaruan

8

好的,这是我们所做的:

1)我们不再使用自定义认证/外部认证,而是在用户注册后在XMPP上创建用户帐户。

2)关于这个问题的答案是会话附加,正如Julien指出的那样。我们创建了一个PHP脚本,用于创建会话并返回会话ID和RID。在用户登录后(文档准备就绪后)通过AJAX调用此脚本。

3)正如我在Julien的帖子评论中所说,我们使用了mod_admin_extra。我们与mod_rest(允许您以REST风格发送数据包/运行命令)配合使用来创建花名册。在我们的网站上每次用户创建联系人时都会调用mod_admin_extra的*add_rosteritem*命令。


通过使用mod_admin_extra,当创建新的花名册条目时,用户是否会收到通知? - André Barbosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接