使用org.eclipse.paho包搭的mqtt client连接到emq认证失败

环境信息

  • EMQX 版本:4.4.2
  • 操作系统及版本:centos7
  • 其他

问题描述

用JAVA写的一个mqtt client,用的依赖包是org.eclipse.paho,启用认证的时候就会报用户名密码错误,不启用认证就能连上

配置文件及日志

2022-04-08T10:22:33.611498+08:00 [debug] 223.75.51.169:54221 [MQTT] RECV CONNECT(Q0, R0, D0, ClientId=in_clientid_1649384552215, ProtoName=MQIsdp, ProtoVsn=3, CleanStart=true, KeepAlive=60, Username=undefined, Password=undefined)
2022-04-08T10:22:33.626781+08:00 [error] in_clientid_1649384552215@223.75.51.169:54221 [Auth http] Deny connection from path: /auth/realms/demo/protocol/openid-connect/token, response http code: 400
2022-04-08T10:22:33.627005+08:00 [warning] in_clientid_1649384552215@223.75.51.169:54221 [Channel] Client in_clientid_1649384552215 (Username: ‘undefined’) login failed for bad_username_or_password

使用app客户端能认证成功,使用vertx的mqtt包也能认证成功,就org.eclipse.paho这个包认证不成功,试了http方式和jwt方式都不行,大佬帮忙指导下

看下是不是没有设置MQTT登陆用户名

@Bean
public MqttConnectOptions getMqttConnectOptions(){
    MqttConnectOptions options = new MqttConnectOptions();
    // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,
    // 这里设置为true表示每次连接到服务器都以新的身份连接(默认)
    options.setCleanSession(false);
    // 设置连接的用户名
    options.setUserName(username);
    // 设置连接的密码
    options.setPassword(password.toCharArray());
    options.setServerURIs(url.split(","));
    //options.setServerURIs(new String[]{url});
    // 设置超时时间 单位为秒
    options.setConnectionTimeout(10);
    // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线,但这个方法并没有重连的机制
    options.setKeepAliveInterval(20);
    // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。
    options.setWill("willTopic", WILL_DATA, 2, false);

    log.info(JSON.toJSONString(options));
    return options;
}

都有设置的

可以尝试抓包看下,对比一下你的认证信息,从正常的服务中发出来的,和从paho发出的信息,有什么区别。不过现在看到的日志显示,这个终端没有带用户名密码上来,两个值都是undefined

paho是没把username和password带上来,你知道如何解决吗?

这个username值估计你传给pahosdk的时候就是空的,很多人都是采用这个sdk。这个基本sdk不会出问题。你自己打个日志看一下是否传值的时候就是空的

1 个赞

@DDDHuangJWT 搜到此处

我遇到一个类似的问题 https://askemq.com/t/topic/2641/9,
官网文档没有找到明确的说明

是否,在 JWT 认证时, jwt from = password 模式下,也必须填写一个 username ?