文章适用于EMQ X Broker 4.3.5版本

Mnesia 认证使用 EMQX 内置 Mnesia 数据库存储客户端 Client ID/Username 与密码,支持通过 HTTP API 管理认证数据。

Mnesia 认证不依赖外部数据源,使用上足够简单轻量。

首先启动插件emqx_auth_mnesia

加密方式

Mnesia 认证默认使用 sha256 进行密码哈希加密,可在 /etc/emqx/plugins/emqx_auth_mnesia.conf 中更改:

1
2
3
4
5
# etc/plugins/emqx_auth_mnesia.conf

## Value: plain | md5 | sha | sha256
auth.mnesia.password_hash = sha256

配置哈希方法后,新增的预设认证数据与通过 HTTP API 添加的认证数据将以哈希密文存储在 EMQ X 内置数 据库中。

预设认证

可以通过配置文件预设认证数据,编辑配置文件:/etc/emqx/plugins/emqx_auth_mnesia.conf

预设认证数据格式兼容 emqx_auth_clientidemqx_auth_username 插件的配置格式

1
2
3
4
5
6
7
8
9
10
# etc/plugins/emqx_auth_mnesia.conf

## clientid 认证数据
##auth.client.1.clientid = admin
##auth.client.1.password = public

## username 认证数据
##auth.user.2.username = admin
##auth.user.2.password = public

插件启动时将读取预设认证数据并加载到 EMQX 内置数据库中,节点上的认证数据会在此阶段同步至集群中。

预设认证数据在配置文件中使用了明文密码,出于安全性与可维护性考虑应当避免使用该功能。

HTTP API 管理认证

EMQ X提供了对应的HTTP API用以维护内置数据源中的认证信息,我们可以用API调试工具,通过EMQX提供的API接口添加/查看/取消/更改认证数据

这里通过VSCode来访问EMQ X的API。VSCode需要安装REST Client插件。

创建一个.http文件,定义好相关的内容

1
2
3
4
5
6
7
8
9
10
11
# EMQX服务器地址
@hostname = 192.168.200.129
# EMQX服务器端口号
@port=18083
# 传输类型
@contentType=application/json
# 用户名
@userName=admin
# 密码
@password=public

查看已添加的认证数据

  • 查看username认证数据
1
2
3
4
#############查看已有用户认证数据##############
GET http://{{hostname}}:{{port}}/api/v4/auth_username HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

  • 查看clientid认证数据
1
2
3
#############获取所有详细信息########
GET http://{{hostname}}:{{port}}/api/v4/auth_clientid HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

添加认证数据

  • 添加username认证数据

使用 POST 请求添加 username 为 user password 为 123456 的认证信息,返回信息中 code = 0 即为成 功。

1
2
3
4
5
6
7
8
########添加用户认证数据##############
POST http://{{hostname}}:{{port}}/api/v4/auth_username HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

{
"username": "user",
"password": "123456"
}
  • 添加clientid认证数据

使用 POST 请求添加 clientid 为 emq-client1 password 为 123456 的认证信息,返回信息中 code = 0 即 为成功。

1
2
3
4
5
6
7
8
####添加clientId和密码#####
POST http://{{hostname}}:{{port}}/api/v4/auth_clientid HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

{
"clientid": "emq-client1",
"password": "123456"
}

更改已添加的认证数据

  • 更改指定username的密码

指定用户名,传递新密码进行更改,再次连接时需要使用新密码进行连接:

1
2
3
4
5
6
7
###########更改指定用户名的密码#############
PUT http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

{
"password": "654321"
}
  • 更改指定 Client ID 的密码API

指定 Client ID,传递新密码进行更改,再次连接时需要使用新密码进行连接:

1
2
3
4
5
6
7
#############更改指定 Client ID 的密码########
PUT http://{{hostname}}:{{port}}/api/v4/auth_clientid/emq-client1 HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

{
"password": "654321"
}

查看指定的认证数据

注意此处返回的密码是使用配置文件指定哈希方式加密后的密码:

  • 查看指定username信息
1
2
3
4
###########查看指定用户名信息#############
GET http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

  • 查看指定clientid信息
1
2
3
#############获取指定ClientId详细信息########
GET http://{{hostname}}:{{port}}/api/v4/auth_clientid/emq-client1 HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

删除指定的认证数据

  • 删除指定username
1
2
3
###########删除指定的用户信息#############
DELETE http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}
  • 删除指定clientid
1
2
3
#############删除指定的client信息########
DELETE http://{{hostname}}:{{port}}/api/v4/auth_clientid/emq-client1 HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

批量添加认证数据

和添加认证数据用到的接口相同,只是参数不同。

  • 批量添加username
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
########批量添加用户认证数据##############
POST http://{{hostname}}:{{port}}/api/v4/auth_username HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

[
{
"username": "user",
"password": "123456"
},
{
"username": "test",
"password": "456789"
},
]

  • 批量添加clientid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
########批量添加Cilent ID认证数据##############
POST http://{{hostname}}:{{port}}/api/v4/auth_clientid HTTP/1.1 Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

[
{
"clientid": "clientid1",
"password": "123456"
},
{
"clientid": "clientid2",
"password": "456789"
},
]