0

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

我有一个工作服务器,它接受来自 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 事件确实会触发,但这是唯一触发的事件。有没有一种方法可以手动触发文档中未表达的身份验证?

4

3 回答 3

1

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

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

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

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

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

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

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

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

于 2021-02-22T22:34:54.720 回答
1

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

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

client.sasl.disable('X-OAUTH2')
于 2021-03-31T19:59:14.640 回答
0

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

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

sudo tcpflow -i lo -Cg port 5222

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

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

loglevel: debug
于 2021-02-19T13:03:00.163 回答