mqtt客户端(golang版本)在publish和subscribe操作时不会返回ACL鉴权失败信息

环境信息

  • EMQX 版本:4.4.4
  • 操作系统及版本:windows10
  • 其他

问题描述

问题:mqtt客户端(golang版本)在publish和subscribe操作时不会返回ACL鉴权失败信息
预期效果:如果是ACL鉴权失败,客户端应该能感知到,而不是误以为鉴权ok,但实际上报错了只是客户端感知不到

配置文件及日志

for i := 0; i < 5; i++ {
		text := fmt.Sprintf("this is msg #%d!", i)
		token := c.Publish("testtopic", 1, false, text)
		fmt.Println(token.Wait(),token.Error()) // 返回true nil
	}

2022-09-15T02:20:14.376889+00:00 [warning] demo1@172.17.0.1:49052 [Channel] Cannot publish message to testtopic due to Not authorized.
2022-09-15T02:20:14.378814+00:00 [warning] demo1@172.17.0.1:49052 [Channel] Cannot publish message to testtopic due to Not authorized.
2022-09-15T02:20:14.380407+00:00 [warning] demo1@172.17.0.1:49052 [Channel] Cannot publish message to testtopic due to Not authorized.
2022-09-15T02:20:14.382309+00:00 [warning] demo1@172.17.0.1:49052 [Channel] Cannot publish message to testtopic due to Not authorized.
2022-09-15T02:20:14.384890+00:00 [warning] demo1@172.17.0.1:49052 [Channel] Cannot publish message to testtopic due to Not authorized.

MQTT 3.1.1 协议的 PUBACK 是没有 Payload 的,所以没办法表示发布被禁止。但是 MQTT 5.0 是可以的。

对于订阅请求,如果禁止订阅,两个版本的 SUBACK 都有错误码的,是 128。

你好,感谢回复,我使用的客户端是paho.mqtt.golang,看这个SDK没找到错误码,有具体的使用文档介绍吗?在线等

那个我不清楚。如果使用的是 MQTT 3.1.1, PUBACK 是一定没有返回码的。可以换成 MQTT 5.0 协议。

但我现在发现是客户端库的问题,这个SDK在发布/订阅接口只返回了token,我怎么拿到你说的那个PUBACK报文,并解析出错误码呢?

客户端库的使用我不了解,你调查一下他们的文档和源码吧。我说的是 MQTT 3.1.1 协议里就没有 payload 字段,所以是肯定没有办法拿到返回码的。

emqx 4.4.4版本是用的哪个mqtt协议版本呢?emqx5.0.6有点问题,我换到了低版本的emqx

是客户端设置的,协议版本信息包含在 CONNECT 报文里面。

你好,你说的这个SUBACK错误码,有demo演示怎么解析出来吗?任何语言版本的都行

https://github.com/eclipse/paho.golang

可以使用这个客户端,支持mqtt5.0