EMQ 使用 HTTP 服务进行密码认证

1、安装服务器

首先,在 CentOS 中安装 EMQX 服务器。EMQX 支持通过 Yum 源安装,可通过以下 Yum 命令从中自动下载和安装 EMQX。

  1. 通过以下命令配置 EMQX Yum 源:
curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash
  1. 安装以下依赖项:
yum install epel-release -yyum install -y openssl11 openssl11-devel
  1. 运行以下命令安装 EMQX:
sudo yum install emqx -y
  1. 运行以下命令启动 EMQX:
sudo systemctl start emqx
  1. 运行以下命令查看服务是否开启
sudo systemctl status emqx
  1. 在浏览器中输入 ip:18083,进入 EMQX 的 dashboard 面板则说明服务启动成功

注意,安装过程中出现了,通过systemctl命令查看服务已经启动,但客户端无法访问服务的情况。出现这种情况下需要执行cd /usr/bin进入EMQX安装目录,执行sh emqx命令启动EMQX进程。

2、开启 HTTP 认证

2.1、请求格式与返回结果

认证过程类似一个 HTTP API 调用,EMQX 作为请求客户端需要按照 “API” 要求的格式构造并向 HTTP 服务发起请求,而 HTTP 服务需要按照 “客户端” 的要求返回结果:

  • 响应编码格式 content-type 必须是 application/json
  • 认证结果通过 body 中的 result 标示,可选 allowdenyignore
  • 超级用户通过 body 中的 is_superuser 标示,可选 truefalse
  • 从 EMQX v5.7.0 版本开始,可以使用可选的 client_attrs 字段设置客户端属性。请注意,键和值都必须是字符串类型。
  • HTTP 响应状态码 Status Code 应当为 200204,返回 4xx/5xx 状态码时将忽略 body 并判定结果为 ignore,继续执行认证链。

响应示例:

HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
    "result": "allow", // 可选 "allow" | "deny" | "ignore"
    "is_superuser": true, // 可选 true | false,该项为空时默认为 false
    "client_attrs": {
        "role": "admin",
        "sn": "10c61f1a1f47"
    }
}

2.2、通过 DashBoard 配置

  1. 在浏览器中输入 ip:18083,登录进入 dashboard 面板,账号默认为:admin,密码默认为:public

在这里插入图片描述

  1. 点击左侧客户端认,再点击创建按钮

在这里插入图片描述

  1. 认证方式选择 Password-Based 方式

在这里插入图片描述

  1. 数据源选择 HTTP 服务

在这里插入图片描述
5. 配置请求具体参数

  • 请求方式:选择 HTTP 请求方式,可选值: getpost
  • URL:输入 HTTP 服务的 URL 地址。
  • Headers(可选):HTTP 请求头配置。可以添加多个请求头。
  • Pool size(可选):整数,指定从 EMQX 节点到外部 HTTP Server 的并发连接数;默认值:8。
  • 连接超时(可选):填入连接超时等待时长,可选单位:小时、分钟、秒、毫秒。
  • HTTP 管道(可选):正整数,指定无需等待响应可发出的最大 HTTP 请求数;默认值:100。
  • 请求超时(可选):填入连接超时等待时长,可选单位:小时、分钟、秒、毫秒
  • TLS 配置:配置是否启用 TLS。
  • Body:请求模板,对于 POST 请求,它以 JSON 形式在请求体中发送。对于 GET 请求,它被编码为 URL 中的查询参数(Query String)。映射键和值可以使用占位符。

最后点击创建完成相关配置。

在这里插入图片描述

3、编写服务端代码

服务端接收到 EMQX 发来的请求连接的客户端的用户名和密码,从数据库中查出是否有对应密码,并根据结果按 EMQX 要求的响应格式响应。

@RestController
@RequestMapping("/mqtt")
public class MQTTController {

    @RequestMapping(value = "/auth", method = RequestMethod._POST_)
    public ResponseEntity<Map<String, Object>> authMQTTConsumer(@RequestBody Map<String, Object> requestMap, @RequestParam(value = "clientid") String clientId) {
        int status = 200;
        String username = requestMap.get("username").toString();
        String password = requestMap.get("password").toString();
        Map<String, Object> responseBody = new HashMap<>();

        /*
        模拟根据username从数据库中查出数据
         */

        if (username.equals("jack") && password.equals("123")) {
            responseBody.put("result", "allow");
        } else {
            responseBody.put("result", "deny");
            status = 403;
        }
        responseBody.put("is_superuser", false);

        return ResponseEntity._status_(status)
                .header("content-type", "application/json")
                .body(responseBody);
    }
}

这里请求路径为address:port/mqtt/auth?clientid=${clientid},第二节中EMQX的dashboard的URI也应该填写此处的请求路径。

4、测试

可在 Windows 上安装 MQTTX 作为客户端进行测试。MQTTX 下载链接:https://mqttx.app/zh

在 MQTTX 中新建连接,填写 EMQX 的服务器地址和端口号,端口号默认为1883,填写用户名和密码进行请求连接。

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值