【问题标题】:Creating persistent connection between Converse JS and Openfire Server在 Converse JS 和 Openfire Server 之间创建持久连接
【发布时间】:2015-11-26 20:25:27
【问题描述】:

使用

目前,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
});

据我了解,整个过程如下:

  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 从 XMPP 服务器(jid、sid、rid)获取结果
  4. 以 JSON 格式返回 jid、sid、rid

所以问题是

困惑从第二步开始:由于 XMPP 身份验证,我应该在 PHP 会话中保存用户的 XMPP 密码并以纯文本格式登录吗?还是我弄错了,有更安全的方法来实现它?

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

【问题讨论】:

  • 你有解决办法吗

标签: javascript php xmpp openfire converse.js


【解决方案1】:

困惑从第二步开始:由于 XMPP 身份验证,我应该在 PHP 会话中保存用户的 XMPP 密码并以纯文本格式登录吗?还是我弄错了,有更安全的方法来实现它?

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

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

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

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

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

在第三步中,在使用有效的用户名和密码进行测试时,收到无效的质询响应错误。是否有任何用于从 PHP 进行身份验证的工作库?

据我所知,从 converse.js 文档链接到的库有效。它被不同的人使用。

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2016-11-08
    • 2018-12-01
    • 2016-03-29
    相关资源
    最近更新 更多