HTTP认证

更新时间:
复制为 MD 格式

云消息队列 MQTT 版支持通过外部 HTTP 服务进行客户端认证。客户端在连接时,MQTT 服务器使用客户端信息构造 HTTP 请求,请求配置的 HTTP 认证服务,并根据请求返回的内容判断认证结果,从而实现复杂的认证鉴权逻辑。这种鉴权模式比较灵活自由,一般适用于自建上云迁移场景,以便尽可能地与原有权限校验方式保持一致。

前提条件

  • 已创建云消息队列 MQTT 版实例,且实例规格为铂金版或专业版。具体操作,请参见创建实例。

  • 实例所在地域为杭州、上海或北京。如需在其他地域使用 HTTP 认证功能,请提交工单申请。

  • 已开通 HTTP 认证功能白名单。如需使用该功能,请提交工单申请。

  • 已在 VPC 内部署 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 认证

  1. 登录云消息队列 MQTT 版控制台

  2. 在左侧导航栏,单击实例列表。

  3. 在顶部菜单栏选择目标地域,然后在实例列表中单击目标实例名称。

  4. 在左侧导航栏,单击HTTP认证

    说明

    首次进入 HTTP 认证页面时,系统会弹出对话框,提示创建服务关联角色 AliyunServiceRoleForMqttTunnel。单击确定,系统将自动创建该角色,用于实现 HTTP 认证的网络通道功能。详情请参见服务关联角色。

  5. HTTP认证页面,配置以下参数:

    参数

    说明

    HTTP 认证

    单击开关,开启 HTTP 认证功能。

    请求方式

    HTTP 请求方式,固定为 POST。

    URL

    HTTP 认证服务的 URL 地址,建议配置 VPC 内网地址。

    VPC

    选择 HTTP 认证服务所在的 VPC。

    vSwitch

    分别选择不同可用区的 vSwitch。每个可用区需要选择一个 vSwitch,用于创建网络通道。

  6. 配置请求参数:

    Headers 配置:

    参数

    说明

    Content-Type

    application/json

    固定值,不可修改

    Body 配置:

    参数

    说明

    username

    ${username}

    运行时替换为 CONNECT 报文中的 Username 字段,不可修改

    password

    ${password}

    运行时替换为 CONNECT 报文中的 Password 字段,不可修改

    clientid

    ${clientid}

    运行时替换为客户端 ID,不可修改

    token

    自定义值

    可选参数,用于 HTTP 服务器认证 MQTT 请求的身份

  7. 配置 HTTP 参数:

    参数

    说明

    连接超时时间

    设置连接超时等待时长,范围为 1~5 秒,默认为 5 秒。

    请求超时时间

    设置请求超时等待时长,范围为 1~5 秒,默认为 5 秒。

  8. 配置完成后,单击页面左上角的确定

    系统开始创建网络通道,需要等待 1~3 分钟。创建完成后,您可以单击 URL 右侧的检测按钮,验证网络连通性。

关闭 HTTP 认证

  1. 登录云消息队列 MQTT 版控制台

  2. 在左侧导航栏,单击实例列表。

  3. 在顶部菜单栏选择目标地域,然后在实例列表中单击目标实例名称。

  4. 在左侧导航栏,单击HTTP认证

  5. HTTP认证页面,单击 HTTP 认证开关,将状态置为关闭。

  6. 单击页面左上角的确定

    系统开始删除网络通道,需要等待 1~3 分钟。

Group 降级

云消息队列 MQTT 版定义了 Group,用于指定一组逻辑功能完全一致的节点共用的组名,代表一类相同功能的设备。ClientId 由两部分组成,格式为 <GroupID>@@@<DeviceID>。

由于该格式的限制,已有自定义设备 ID 难以直接迁移。为此,云消息队列 MQTT 版支持 Group 降级功能,即 ClientId 可以任意填写。

说明

启用 Group 降级后,部分控制台功能(如设备查询、设备轨迹查询)将不可用。如需使用该功能,请提交工单申请。