消息队列 MQTT 版支持通过对接外部第三方的 HTTP 服务进行客户端认证和简单的鉴权。
客户端在进行连接(发送 Connect Packet)时,MQTT 使用客户端的信息(例如用户名,密码等)构造 HTTP 请求,请求到达指定的 HTTP 认证服务后,MQTT 会根据该 HTTP 请求的返回结果来判断认证是否通过。如果认证通过,则允许该客户端连接服务端;如果认证不通过,则拒绝该客户端的连接。
说明:
该功能仅专业版支持。
认证原理
当 MQTT 客户端连接到 MQTT 时,MQTT 作为请求客户端需要按照 "API" 要求的格式构造并向 HTTP 服务发起请求,而 HTTP 服务需要按照 "客户端" 的要求返回结果,HTTP 响应状态码 (HTTP Status Code) 被用于判断认证请求是否成功。HTTP 认证服务需要满足以下条件:
HTTP 响应的编码格式
content-type
必须是 application
或者json
。认证结果由
body
中的 result
标示,可选 allow
、deny
、ignore
。是否为超级用户由
body
中的 is_superuser
标示,可选 true
、false
。认证结果应通过
Status Code
200
或 204
进行返回。其他响应码将被认为 HTTP 认证请求执行失败,例如
4xx
、5xx
等。此时认证结果使用缺省值ignore
,继续执行认证链。如果当前的 HTTP 认证器是链上的最后一个认证器,则认证失败,客户端将被拒绝连接。响应示例如下:
HTTP/1.1 200 OKHeaders: Content-Type: application/json...Body:{"result": "allow", // "allow" | "deny" | "ignore""client_attrs": {"role": "admin","sn": "10c61f1a1f47"}"expire_at": 1654254601, // 可选,表示当前认证策略的过期时间"acl": // 可选,用于使用既有的HTTP认证服务支持简单的授权,授权策略将会被缓存到MQTT服务端,再次触发时更新[{"effect": "allow","action": ["publish","subscribe","connect"],"topic": "topic/AA/#","qos": [1]},{"effect": "deny","action": ["publish","connect"],"topic": "topic/BB"}]}
操作步骤
1. 登录 MQTT 控制台。
2. 在左侧导航栏单击资源管理 > 集群管理,选择好地域后,单击目标集群的“ID”,进入集群基本信息页面。
3. 在集群详情页,选择认证管理,进入外部 HTTP 认证页签,单击创建认证。
请求方式:选择 HTTP 请求方式,可选值:
get
, post
。服务地址:请输入 HTTP(S) 服务的 URL。
Headers:HTTP 请求头配置,可以添加多个请求头,在填写值(value)时支持和模板变量,格式为"${变量名称}",通过输入"${"可以触发提示。
Body:请求模板,在填写值(value)时支持和模板变量,格式为"${变量名称}",通过输入"${"可以触发提示。
最大请求并发数:设置最大请求并发数,范围为1-10。
连接超时时间:设置连接超时等待时长,范围为1-30秒。
请求超时时间:设置请求超时等待时长,范围为1-30秒。
说明:填写说明信息,不能超过 128 个字符。
4. 单击确认完成创建。
5. 创建完成后,可以单击右上方的 
进行认证参数的调试。

