EMQ X Broker 的认证支持包括两个层面:
MQTT 协议本身在 CONNECT 报文中指定用户名和密码,EMQ X Broker 以插件形式支持基于 Username、ClientID、HTTP、JWT、LDAP 及各类数据库如 MongoDB、MySQL、PostgreSQL、Redis 等多种形式的认证。
在传输层上,TLS 可以保证使用客户端证书的客户端到服务器的身份验证,并确保服务器向客户端验证服务器证书。也支持基于 PSK 的 TLS/DTLS 认证。
Username 认证使用配置文件预设客户端用户名与密码,支持通过 HTTP API 管理认证数据。
插件:emqx_auth_username
可以通过配置文件预设认证数据,编辑配置文件:etc/plugins/emqx_auth_username.conf
# etc/plugins/emqx_auth_username.conf
## 第一组认证数据
auth.user.1.username = admin
auth.user.1.password = public
## 第二组认证数据
auth.user.2.username = wivwiv
auth.user.2.password = public
插件启动时将读取预设认证数据并加载到 EMQ X Broker 内置数据库中,节点上的认证数据会在此阶段同步至集群中
与用户名密码认证类似:编辑配置文件:etc/plugins/emqx_auth_clientid.conf
进行身份认证时,EMQ X Broker 将使用当前客户端信息填充并发起用户配置的认证查询请求,查询出该客户端在 HTTP 服务器端的认证数据。
## 请求地址
auth.http.auth_req = http://127.0.0.1:8991/mqtt/auth
## HTTP 请求方法
## Value: post | get | put
auth.http.auth_req.method = post
## 请求参数
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
%u:用户名
%c:Client ID
%a:客户端 IP 地址
%r:客户端接入协议
%P:明文密码
%p:客户端端口
%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
%d:TLS 证书 subject,仅当 TLS 连接时有效
JWT 认证基于 Token 的鉴权机制,不依赖服务端保留客户端的认证信息或者会话信息,在持有密钥的情况下可以批量签发认证信息,是最简便的认证方式。
插件:
emqx_auth_jwt
MySQL 认证使用外部 MySQL 数据库作为认证数据源,可以存储大量数据,同时方便与外部设备管理系统集成。
emqx_auth_mysql
MySQL 基础连接信息,需要保证集群内所有节点均能访问。
# etc/plugins/emqx_auth_mysql.conf
## 服务器地址
auth.mysql.server = 127.0.0.1:3306
## 连接池大小
auth.mysql.pool = 8
auth.mysql.username = emqx
auth.mysql.password = public
auth.mysql.database = mqtt
auth.mysql.query_timeout = 5s