微消息队列 MQTT 通过 Token 鉴权模式向 MQTT 客户端提供有时效性的临时访问权限。通过 MQTT Token 服务可以给本地账号系统管理的用户颁发临时的访问凭证,并限制访问权限,以实现对单一客户端,单一资源的细粒度权限控制。

用户作为本地账号管理者,为实际客户端申请临时访问凭证(Token),客户端使用临时凭证来做实际的业务访问。Token 代表单一客户端的临时身份,由业务管理者指定该 Token 所拥有的权限、资源列表和访问类型,以实现对单一客户端,单一资源的细粒度权限控制。

术语 中文名称 说明
Token 临时凭证 微消息队列 MQTT 颁发的临时访问凭证,代表单一客户端对特定资源的访问权限
AppServer 应用服务器 用户管理本地账号的服务器,用来替客户端申请和管理 Token 服务的应用
AuthServer 认证服务器 微消息队列 MQTT 权限认证服务器,用来处理 AppServer 发起的 Token 相关的请求

使用流程

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


具体步骤如下:

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

客户端行为约束

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

应用服务器行为约束

  • 应用服务器必须验证自己的客户端是否合法,避免客户端冒用身份申请 Token。
  • 应用服务器应该对 Token 和客户端的关系进行管理,避免同一个客户端重复调用。
  • 应用服务器需要做本地容灾,避免因访问认证服务器短暂不可用导致的业务阻塞。

相关 API

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

Token 的申请和吊销管理交由应用服务器负责,和微消息队列 MQTT 认证服务器之间通过 HTTPS 的 Open API 进行交互。每个接口都要求通过 AccessKey 和请求签名做来做身份验证。目前开放申请 Token、吊销 Token 以及校验 Token 接口。

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

Token 服务地址

目前 Token 服务支持国内公共云地域和新加坡地域,暂不支持金融云。具体的服务地址如下:

服务地域 Token 服务器地址
华北2 mqauth.aliyuncs.com
公网 mqauth.aliyuncs.com
华东1 mqauth.aliyuncs.com
华东2 mqauth.aliyuncs.com
华南1 mqauth.aliyuncs.com
新加坡 mqauth.ap-southeast-1.aliyuncs.com