如何调试 Stanza.js 身份验证?

时间:2021-02-17 21:21:34

标签: javascript xmpp ejabberd stanza.io

我目前正在尝试使用 Stanza.js 设置 XMPP 客户端 https://github.com/legastero/stanza

我有一个工作服务器,它接受来自 Gajim 客户端的连接,但是当尝试使用 Stanza.js client.connect 方法进行连接时,服务器打开了一个 websocket 连接,但没有用于身份验证的事件,或者会话开始启动。

服务器日志未显示任何明文密码身份验证尝试。

我如何才能真正看到任何节日志来调试这个问题?

import * as XMPP from 'stanza';

const config = { credentials: {jid: '[jid]', password: '[password]'}, transports: {websocket: '[socketurl]', bosh: false} };
const client = XMPP.createClient(config)
client.on('raw:*', (data) => {
    console.log('data', data)
})

client.connect();

onconnect 事件确实触发,但这是唯一触发的事件。 有没有办法手动触发文档中未提及的身份验证?

3 个答案:

答案 0 :(得分:1)

原始事件处理程序应该能够为您提供所需的日志记录 - 但在您的代码示例中,您错误地调用了它。请尝试以下操作。

client.on('raw:*', (direction, data) => {
    console.log(direction, data)
})

作为参考,docs 声明原始数据事件处理程序的回调是

(direction: incoming | outgoing, data: string) => void

所以您要查找的数据在第二个参数中,但您的回调只有一个参数(只有方向字符串“传入”或“传出”,尽管您已将参数命名为“数据”)。

一旦您修复了日志记录,我希望您会看到流立即因流错误而终止。你的配置不正确。 jid 和密码应该是顶级字段。查看节示例代码。对于 createClient 的选项 - 没有凭据对象。请尝试以下操作:

const config = { jid: '[jid]', password: '[password]', transports: {websocket: '[socketurl]', bosh: false} };

由于您的用户名和密码隐藏在不正确的凭据对象后面,stanza.io 看不到它们,您实际上是在尝试使用没有用户名和密码的连接,因此甚至没有尝试进行身份验证。

答案 1 :(得分:1)

这个问题是由配置问题引起的。

jabber 服务器正在使用普通身份验证。 在客户端定义文件中添加额外的行有帮助。 还添加 client.on('*', console.log) 提供更完整的服务器日志。

client.sasl.disable('X-OAUTH2')

答案 2 :(得分:0)

<块引用>

我如何才能真正看到任何节日志来调试这个问题?

如果连接未加密,您可以使用类似工具来嗅探 XMPP 流量

sudo tcpflow -i lo -Cg port 5222

您可以强制 ejabberd 不允许加密,这样您的客户端就不会使用它,并且您可以读取网络流量。

或者,您可以在 ejabbed.yml 中进行设置,但可能会生成大量日志消息:

loglevel: debug