环境信息
- 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方式都不行,大佬帮忙指导下
@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 个赞
foo
8
@DDDHuang 搜 JWT
搜到此处
我遇到一个类似的问题 https://askemq.com/t/topic/2641/9,
官网文档没有找到明确的说明
是否,在 JWT
认证时, jwt from = password
模式下,也必须填写一个 username
?