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

标签 javascript php xmpp openfire converse.js

使用

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

我想实现的是:

当用户登录网站时,Converse JS 也必须登录并与 Openfire XMPP Server 创建持久连接在整个用户 session 期间,直到注销。

我发现了什么

在 Converse JS 和 Openfire 网站上进行了大量谷歌搜索和研究。

阅读,有prebind propertySingle Session Support对于 Converse JS,它可以实现我想要的。他们还提供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,据我所知,为了保持用户登录 Messenger,可以向 http://example.com/api/prebind 发送请求几乎每次需要时(jid、sid、rid)。因此,从 PHP 端来看,每次都需要准备好纯文本身份验证。
  3. PHP 后端使用 PHP library 从 XMPP 服务器(jid、sid、rid)获取结果
  4. 以 JSON 格式返回 jid、sid、rid

那么问题是

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

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

最佳答案

Confusion starts in 2nd step: should I save user's XMPP password and login in plain text format in PHP sessions because of XMPP authentication? Or am I getting it wrong and there is more secure way to achieve it?

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

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

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

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

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

And in 3rd step, while testing with working username and password getting Invalid challenge response received error. Is there any working library for authenticating from PHP?

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

关于javascript - 在 Converse JS 和 Openfire Server 之间创建持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334337/

相关文章:

javascript - 比较两个日期并创建输出

javascript - 当我想覆盖之前的push()条目时,AngularJS使用push()问题

javascript - 将数组转换为动态对象

php - 使用 PUT 而不是 POST 提交表单

php - MySQL:如何让行重复 x 次

android - 存在监听器无法在 asmack 中工作

php - Facebook XMPP 聊天 API 发送消息 PHP

ios - 从 NSXMLElement 中获取值

javascript - Ajax/JQuery : Slow down other divs below to jump-up when deleted

javascript - 当我在 javascript 中删除鼠标当前所在的元素时,是否会发生 onMouseOut 事件?