在Converse JS和Openfire Server之间创建持久连接

时间:2015-09-01 14:31:58

标签: javascript php xmpp openfire converse.js

使用

目前,Openfire和网站都有单独的数据库,但它们是同步的。

我想要实现的是:

当用户登录网站时,Converse JS还必须在整个用户会话期间登录并与Openfire XMPP Server建立持久连接,并且注销。

我发现了什么

搜索了很多并研究了Converse JS和Openfire网站。

请注意,Converse JS有prebind propertySingle Session Support,可以实现我想要的效果。他们还为网站提供了PHP library示例。

我做了什么

Converse JS的初始脚本如下:

converse.initialize({
    bosh_service_url: 'https://bind.example.com',
    keepalive: true,
    jid: 'me@example.com',
    authentication: 'prebind',
    prebind_url: 'http://example.com/api/prebind',
    allow_logout: false
});

据我所知,整个过程如下:

enter image description here

  1. 将jid发送到prebind_url,即http://example.com/api/prebind(请查看配置属性 以上)
  2. PHP后端接收jid(用户名)。要在XMPP服务器密码中进行身份验证,登录必须采用纯文本格式。据我所知,Converse JS保持用户登录信使,可以在需要时(jid,sid,rid)每次都向http://example.com/api/prebind发送请求。因此,从PHP端开始,每次都需要准备纯文本身份验证。
  3. PHP后端使用PHP library
  4. 从XMPP服务器(jid,sid,rid)获取结果
  5. 返回jid,sid,rid为JSON
  6. 所以问题是

    混乱从第2步开始:我是否应该保存用户的XMPP密码并在PHP会话中以纯文本格式登录,因为XMPP身份验证?或者我错了,有更安全的方法来实现它吗?

    在第3步中,使用工作用户名和密码进行测试时出现Invalid challenge response received错误。是否有用于从PHP进行身份验证的工作库?

1 个答案:

答案 0 :(得分:1)

  

混乱从第2步开始:我是否应该保存用户的XMPP密码并在PHP会话中以纯文本格式登录,因为XMPP身份验证?或者我错了,有更安全的方法来实现它吗?

您需要某种方法来对XMPP服务器进行身份验证。一种方法是将用户名和密码存储在纯文本中并使用它们登录。这有明显的缺点。

另一种方法是让XMPP服务器依次对某些外部服务进行身份验证(所谓的外部身份验证)。通常,您希望此外部服务成为您自己的后端应用程序。

例如,您可以将JID和特殊生成的令牌作为密码发送到XMPP服务器。然后,XMPP服务器使用外部身份验证来调用其他一些Web服务(例如您的webapp)来检查该JID和令牌是否有效。

每次进行身份验证时,都会生成一个新令牌。这样您根本不需要存储任何密码,但是您需要跟踪(并使无效)临时令牌。

以下是ejabberd的外部身份验证脚本的一些示例:https://www.ejabberd.im/extauth

  

在第3步中,使用工作用户名和密码进行测试时收到Invalid challenge response错误。是否有用于从PHP进行身份验证的工作库?

据我所知,从converse.js文档链接到的库可以正常工作。它被不同的人使用。