HTTP认证
云消息队列 MQTT 版支持通过外部 HTTP 服务进行客户端认证。客户端在连接时,MQTT 服务器使用客户端信息构造 HTTP 请求,请求配置的 HTTP 认证服务,并根据请求返回的内容判断认证结果,从而实现复杂的认证鉴权逻辑。这种鉴权模式比较灵活自由,一般适用于自建上云迁移场景,以便尽可能地与原有权限校验方式保持一致。
前提条件
使用限制
限制项 | 说明 |
支持版本 | 仅支持铂金版和专业版实例 |
支持地域 | 杭州、上海、北京 |
HTTP 服务数量 | 单个实例仅支持配置一个 HTTP 认证服务 |
ACL 规则数量 | 请求响应结果中,ACL 规则数量不超过 10 个 |
响应内容大小 | 返回内容大小不超过 4 KB |
计费说明
云消息队列 MQTT 版 HTTP 认证功能目前处于公测阶段,暂不收取费用,但会对 TPS 进行统计,并根据规格限制 TPS 的上限。
流程说明
客户端连接
当 MQTT 客户端向 MQTT 服务器发起连接请求时,MQTT 服务器会向配置的 HTTP 认证服务发起认证请求。HTTP 服务根据请求参数进行身份验证,并返回认证结果。
发送消息或订阅
客户端连接成功后,发送消息或订阅时,MQTT 服务器会根据 HTTP 响应中的 ACL 规则进行权限校验。
认证原理
当 MQTT 客户端连接到 MQTT 服务器时,MQTT 服务器作为请求客户端,按照 API 要求的格式构造请求,向配置的 HTTP 服务发起认证请求。HTTP 服务需要按照规定的格式返回结果,MQTT 服务器根据返回内容判断认证结果。
HTTP 认证服务需要满足以下条件:
HTTP 响应的编码格式 content-type 必须是 application/json。
认证结果由 body 中的 result 字段标示,可选值为 allow 或 deny。
认证结果应通过 HTTP 状态码 200 返回。其他响应码(如 4xx、5xx)将被认为 HTTP 认证请求执行失败。
响应示例
HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
"result": "allow", // "allow" 、 "deny"
"expireAt": 1234, // 过期时间点(可选)
"acl":
[
{
"effect": "allow",
"action": ["publish","subscribe"],
"topic": "topic/abc/#"
},
{
"effect": "deny",
"action": ["publish"],
"topic": "topic/abcd"
}
]
}响应参数说明:
参数 | 类型 | 是否必选 | 说明 |
result | String | 是 | 认证结果,取值:allow(允许)、deny(拒绝) |
expireAt | Long | 否 | 认证结果过期时间点,Unix 时间戳(秒) |
acl | Array | 否 | ACL 规则列表,用于细粒度的发布/订阅权限控制 |
ACL 规则参数:
参数 | 类型 | 说明 |
effect | String | 规则效果,取值:allow(允许)、deny(拒绝) |
action | Array | 操作类型,取值:publish(发布)、subscribe(订阅) |
topic | String | Topic 匹配规则,支持通配符 # 和 + |
配置并开启 HTTP 认证
在左侧导航栏,单击实例列表。
在顶部菜单栏选择目标地域,然后在实例列表中单击目标实例名称。
在左侧导航栏,单击HTTP认证。
说明首次进入 HTTP 认证页面时,系统会弹出对话框,提示创建服务关联角色 AliyunServiceRoleForMqttTunnel。单击确定,系统将自动创建该角色,用于实现 HTTP 认证的网络通道功能。详情请参见服务关联角色。
在HTTP认证页面,配置以下参数:
参数
说明
HTTP 认证
单击开关,开启 HTTP 认证功能。
请求方式
HTTP 请求方式,固定为 POST。
URL
HTTP 认证服务的 URL 地址,建议配置 VPC 内网地址。
VPC
选择 HTTP 认证服务所在的 VPC。
vSwitch
分别选择不同可用区的 vSwitch。每个可用区需要选择一个 vSwitch,用于创建网络通道。
配置请求参数:
Headers 配置:
参数
值
说明
Content-Type
application/json
固定值,不可修改
Body 配置:
参数
值
说明
username
${username}
运行时替换为 CONNECT 报文中的 Username 字段,不可修改
password
${password}
运行时替换为 CONNECT 报文中的 Password 字段,不可修改
clientid
${clientid}
运行时替换为客户端 ID,不可修改
token
自定义值
可选参数,用于 HTTP 服务器认证 MQTT 请求的身份
配置 HTTP 参数:
参数
说明
连接超时时间
设置连接超时等待时长,范围为 1~5 秒,默认为 5 秒。
请求超时时间
设置请求超时等待时长,范围为 1~5 秒,默认为 5 秒。
配置完成后,单击页面左上角的确定。
系统开始创建网络通道,需要等待 1~3 分钟。创建完成后,您可以单击 URL 右侧的检测按钮,验证网络连通性。
关闭 HTTP 认证
在左侧导航栏,单击实例列表。
在顶部菜单栏选择目标地域,然后在实例列表中单击目标实例名称。
在左侧导航栏,单击HTTP认证。
在HTTP认证页面,单击 HTTP 认证开关,将状态置为关闭。
单击页面左上角的确定。
系统开始删除网络通道,需要等待 1~3 分钟。
Group 降级
云消息队列 MQTT 版定义了 Group,用于指定一组逻辑功能完全一致的节点共用的组名,代表一类相同功能的设备。ClientId 由两部分组成,格式为 <GroupID>@@@<DeviceID>。
由于该格式的限制,已有自定义设备 ID 难以直接迁移。为此,云消息队列 MQTT 版支持 Group 降级功能,即 ClientId 可以任意填写。
启用 Group 降级后,部分控制台功能(如设备查询、设备轨迹查询)将不可用。如需使用该功能,请提交工单申请。