一机一密认证方法,即预先为每个设备申请唯一的访问凭证(ClientId、DeviceAccessKeyId和DeviceAccessKeySecret)。当设备与微消息队列MQTT版建立连接时,需要将设备访问凭证中的信息按照约定的形式设置到Username和Password中,向微消息队列MQTT版发起认证请求,微消息队列MQTT版认证通过后激活设备,设备与微消息队列MQTT版间才可传输数据。

名词解释

术语 说明
设备访问凭证 MQTT服务器为用户客户端颁发的访问凭证,包含DeviceAccessKeyId和DeviceAccessKeySecret,与Client ID绑定并全局唯一。客户端与微消息队列MQTT版建立连接时,需要按照约定形式将设备访问凭证中的DeviceAccessKeyId和DeviceAccessKeySecret设置到Username和Password中进行认证。
应用服务器 您管理本地账号的服务器,用来替客户端申请和管理设备访问凭证服务的应用。
MQTT服务器 微消息队列MQTT版权限认证和消息收发服务器,用来处理应用服务器发起的设备访问凭证相关的请求以及消息收发业务。

计算方式

按照鉴权概述的描述,如果选择一机一密鉴权模式,MQTT客户端实际连接MQTT消息服务器时,connect报文中的Username和Password需要按照本文约定的规范设置,具体设置和计算方法如下:

  • Username

    由鉴权模式名称、DeviceAccessKeyId和InstanceId三部分组成,以竖线(|)分隔。一机一密模式下鉴权模式设置为DeviceCredential

    举例:一个客户端的Client ID是GID_Test@@@0001,使用的实例ID是mqtt-xxxxx,使用的DeviceAccessKeyId是YYYYY,则签名模式的UserName应该设置成 DeviceCredential|YYYYY|mqtt-xxxxx

    Client ID的详细说明请参见名词解释

  • Password

    对Client ID签名的结果。具体计算方法如下:

    举例:一个客户端的Client ID是GID_Test@@@0001,使用的DeviceAccessKeySecret是XXXXX。

    用XXXXX作为密钥,使用HMAC-SHA1方法对待签名字符串GID_Test@@@0001做签名计算得到一个二进制数组,再对该二进制数组做Base64编码得到最终的Password字符串。

    HMAC-SHA1的算法实现,各个语言都有现成的函数库,请自行搜索。

使用流程

使用一机一密鉴权模式,您需要按照下图所示的流程,部署您的应用服务器。而且在初始化时,MQTT客户端需要具备与您的应用服务器交互(获取和更新设备访问凭证)的能力。
图 1. 鉴权流程
一机一密流程图

具体流程如下:

  1. 用户应用服务器调用OpenAPI接口向MQTT服务器发起请求,预先为用户客户端申请设备访问凭证。
  2. MQTT服务器验证申请设备访问凭证的请求,判断合法之后下发对应的设备访问凭证。
  3. 应用服务器将返回的设备访问凭证持久化到本地,对每个客户端对应的访问凭证进行映射。缓存设备访问凭证有以下优势:
    • 只要客户端侧没有发生凭证泄露等问题,设备访问凭证就无需更换,此时可以直接返回缓存的设备凭证,避免申请凭证时接口调用的开销。
    • 客户端重新申请设备访问凭证时,如果MQTT服务器异常,应用服务器可以尝试返回客户端之前申请的设备访问凭证以实现本地容灾。
  4. 用户应用服务器将申请好的设备访问凭证下发给对应的MQTT客户端。
  5. MQTT客户端按照规范将设备访问凭证中的信息作为参数设置,连接MQTT服务器,服务端验证通过后客户端即可正常收发消息。

客户端行为约束

  • 必须按照约定形式将设备访问凭证中的信息作为连接参数设置到Username和Password中,每次连接时上传。
  • 客户端应该对应用服务器返回的设备访问凭证做持久化,避免每次重连都申请一样的设备访问凭证,防止大批量客户端同时连接压垮应用服务器。

应用服务器行为约束

  • 应用服务器应该对设备访问凭证和客户端的映射关系进行管理,避免同一个客户端重复调用。
  • 应用服务器需要做本地容灾,避免因MQTT服务器访问短暂不可用而导致业务阻塞的情况。

相关API

一机一密鉴权流程通过相关的API来完成。应用服务器负责设备访问凭证的申请和管理,和微消息队列MQTT版服务器之间通过HTTPS的OpenAPI进行交互。

每个接口都要求通过AccessKey和请求签名做来做身份验证。目前开放注册、查询、注销和更新设备访问凭证的接口。详细接口信息,请参见一机一密应用服务器接口