一、前言

EMQX支持通过用户名密码进行身份验证。当客户端尝试连接时,需按要求提供是否凭证信息,EMQX会在内置数据库中发起查询,并将返回得到的密码与客户端提供的信息进行匹配,匹配成功后,EMQX将接受客户端的连接请求。

二、客户端认证

1.创建客户端认证

MQTT客户端认证_MQTT

2.我们选择密码认证的方式

MQTT客户端认证_客户端认证_02

3.选择MySQL数据库

MQTT客户端认证_客户端认证_03

4.设置MySQL连接配置参数

MQTT客户端认证_客户端认证_04

5.创建SQL表结构

CREATE TABLE `mqtt_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `password_hash` varchar(100) DEFAULT NULL,
  `salt` varchar(35) DEFAULT NULL,
  `is_superuser` tinyint(1) DEFAULT 0,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

例如,我们希望添加一名用户名为 emqx_sp、密码为 public、盐值为 slat_foo123、散列方式为 sha256 且超级用户标志为 true 的用户:

INSERT INTO mqtt_user ( username, password_hash, salt, is_superuser, created )
VALUES
	(
		'emqx_sp',
		SHA2 ( concat( 'public', 'slat_foo123' ), 256 ),
		'slat_foo123',
	1,
	NOW());

MQTT客户端认证_MySQL_05

对应的查询语句和密码散列方法配置参数为:

  • 密码加密方式:sha256
  • 加盐方式:suffix
  • SQL:
SELECT password_hash, salt, is_superuser FROM mqtt_user WHERE username = ${username} LIMIT 1

我们设置好之后在EMQX平台的客户端认证发送我们已经添加了MySQL密码方式的认证。

MQTT客户端认证_客户端认证_06

三、测试

现在我们去MQTTX客户端进行连接,发现如果没有填上用户名和密码我们就连接不了。

MQTT客户端认证_MySQL_07

当我们填上之前设置的用户名和密码之后,发现连接成功 。

MQTT客户端认证_客户端认证_08

MQTT客户端认证_客户端认证_09