微消息队列MQTT版通过Token鉴权模式向MQTT客户端提供临时访问权限。您可通过MQTT Token服务来给本地账号系统管理的用户颁发临时的访问凭证,并限制访问权限,以实现对单一客户端、单一资源的细粒度权限控制。本文介绍使用流程以及相关注意事项。

名词解释

术语 说明
Token(临时凭证) 微消息队列MQTT版颁发的临时访问凭证,代表单一客户端对特定资源的访问权限。
应用服务器 您管理本地账号的服务器,用来替客户端申请和管理Token服务的应用。
MQTT服务器 微消息队列MQTT版权限认证和消息收发服务器,用来处理应用服务器发起的Token相关的请求以及消息收发业务。

使用流程

Token鉴权模式相比签名模式更加复杂,您需要按照下图所示的流程,部署您的应用服务器。而且在初始化时,MQTT客户端需要具备与您的应用服务器交互(获取和更新Token)的能力。
图 1. 鉴权流程
token_process_new

具体流程如下:

  1. 客户端启动时,需要先连接应用服务器验证身份。
  2. 客户端向应用服务器申请所需的所有Topic的权限。
  3. 应用服务器验证客户端是否有必要操作所需的Topic权限,如果验证通过则向微消息队列MQTT版服务器申请对应资源的Token。
  4. 微消息队列MQTT版服务器验证申请Token的请求,判断合法之后返回对应的Token。
  5. 应用服务器将返回的Token持久化到本地,对每个客户端需要的权限以及Token信息进行映射。缓存Token有以下优势:
    • 客户端重新启动后再访问时,只要权限范围没有变化,应用服务器可以返回缓存的Token,避免重复申请。
    • 客户端重新申请Token时,如果MQTT服务器异常,应用服务器可以尝试返回客户端之前申请的Token以实现本地容灾。
  6. MQTT客户端按照规范将Token作为参数设置,连接MQTT服务器,服务端验证通过后客户端即可正常收发消息。
  7. 客户端正常收发消息。如果服务端判断Token失效,即会触发鉴权失败,断开连接,客户端应该重新发起申请Token的请求。

客户端行为约束

  • 必须按照约定形式将Token作为连接参数设置到Password中,每次连接时上传。
  • 客户端应该知晓自己使用的Token的时效性,确保不要使用过期的Token,否则服务端会断开连接。
  • 客户端可以监听服务端下推的Token失效的通知消息,但服务端不保证通知一定触发,该通知仅供排查问题使用。
  • 客户端应该对应用服务器返回的Token做持久化,避免每次重连都申请一样的Token,防止大批量客户端同时连接压垮应用服务器。
  • 客户端更新Token可以选择关闭旧的客户端连接,然后重新使用新的Token来连接,也可以选择使用MQTT提供的系统Topic动态上传更新Token。如果选择动态更新Token,需要保证本地的配置也同步更新,以供下次连接初始化使用。

应用服务器行为约束

  • 应用服务器必须验证自己的客户端是否合法,避免客户端冒用身份申请Token。
  • 应用服务器应该对Token和客户端的关系、已分配的Token、对应权限内容以及生效时间进行管理,避免同一个客户端重复调用。
  • 应用服务器需要做本地容灾,避免因MQTT服务器访问短暂不可用而导致业务阻塞的情况。

相关API

Token鉴权流程通过相关的API来完成。

  • 应用服务器负责Token的申请和吊销管理,和微消息队列MQTT版服务器之间通过HTTPS的OpenAPI进行交互。

    每个接口都要求通过AccessKey和请求签名做来做身份验证。目前开放申请Token、吊销Token以及校验Token接口。详细接口信息,请参见Token应用服务器接口

  • 微消息队列MQTT版客户端则包括动态更新Token、监听Token失效信息,以及监听Token非法信息三个接口。详细接口信息,请参见Token客户端接口