使用外部 HTTP 服务认证

最近更新时间:2025-03-26 11:53:42

我的收藏
消息队列 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 标示,可选 allowdenyignore
是否为超级用户由 body 中的 is_superuser 标示,可选 truefalse
认证结果应通过 Status Code 200204 进行返回。
其他响应码将被认为 HTTP 认证请求执行失败,例如 4xx5xx 等。此时认证结果使用缺省值ignore,继续执行认证链。如果当前的 HTTP 认证器是链上的最后一个认证器,则认证失败,客户端将被拒绝连接。
响应示例如下:
HTTP/1.1 200 OK
Headers: 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. 创建完成后,可以单击右上方的

进行认证参数的调试。