emqx4.4.3 免费适用版,开启了http远程鉴权,但是通过mqtt客户端测试,错误的账号和密码也可以登录成功!

环境信息

  • EMQX 版本: 4.4.3 docker免费版
  • 操作系统及版本: centeros7
  • 其他

问题描述

emqx4.4.3 免费适用版,开启了http远程鉴权,但是通过mqtt客户端测试,错误的账号和密码也可以登录成功!
请问那个免费版稳定一些?公司想试用下功能,后续可能购买!

配置文件及日志

#auth.http.auth_req.url = http://127.0.0.1:80/mqtt/auth
auth.http.auth_req.url = http://10.144.7.27:7091/auth/userEmqx

HTTP Request Method for Auth Request

Value: post | get

auth.http.auth_req.method = post

HTTP Request Headers for Auth Request, Content-Type header is configured by default.

The possible values of the Content-Type header: application/x-www-form-urlencoded, application/json

Examples: auth.http.auth_req.headers.accept = /

auth.http.auth_req.headers.content_type = application/x-www-form-urlencoded

Parameters used to construct the request body or query string parameters

When the request method is GET, these parameters will be converted into query string parameters

When the request method is POST, the final format is determined by content-type

Available Variables:

- %u: username

- %c: clientid

- %a: ipaddress

- %r: protocol

- %P: password

- %p: sockport of server accepted

- %C: common name of client TLS cert

- %d: subject of client TLS cert

Value: =,=,…

auth.http.auth_req.params = clientid=%c,username=%u,password=%P

需要关闭匿名认证:(关闭匿名认证前,用户名不存在的情况下客户端仍然可以连接成功)

allow_anonymous = false

目前最稳定的版本是每个次要版本的最新版,比如 4.4.x 版本中,请使用 4.4.10

您好!
配置allow_anonymous = false及远程url鉴权的url地址,但是断点发现,返回的statusCode为500也可以登录成功(如代码:result.put(“statusCode”, 500); 请问下是什么原因导致的?另外测试发现:错误账号密码会连续发起4次登录权限认证请求后不在请求,但是客户端却登录成功,而每次返回的状态码statusCode都是500

备注:版本是:docker免费版:4.4.10

连续发起4次登录权限认证请求:可能是客户端重连机制,在连接失败后发起了重试。

EMQX 是通过「HTTP 响应状态码」来判断认证请求,result.put(“statusCode”, 500) 设置的是 HTTP Status Code 吗?可以使用 postman 调用看一下是否符合 EMQX 的要求:

  • 认证失败:API 返回非 200 状态码
  • 认证成功:API 返回 200 状态码
  • 忽略认证:API 返回 200 状态码且消息体 ignore

#


这个是postman跑出来的结果,状态码: “statusCode”: 500 却登录成功


这个是mqttBOX客户端,采用随意的账号:test110和密码:123456 却可以登录成功

按照官方说明:
image

按照这个逻辑,是不应该登录成功才对

另外:确认下,这个状态返回格式{“code”: 200},还是{“statusCode”:200}?但是测试这两种都无效!!!

都不是,是 HTTP Status Code,在 response 里面返回的那个,比如 401 是这么返回的:

curl http://localhost:18083/api/v4/1 -i
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic Realm="minirest-server"
content-length: 12
date: Fri, 28 Oct 2022 07:10:50 GMT
server: Cowboy

...

非常感谢!明白了!