Token鉴权概述
云消息队列 MQTT 版通过Token鉴权模式向MQTT客户端提供临时访问权限。您可通过MQTT Token服务来给本地账号系统管理的用户颁发临时的访问凭证,并限制访问权限,以实现对单一客户端、单一资源的细粒度权限控制。本文介绍使用流程以及相关注意事项。
名词解释
术语 | 说明 |
Token(临时凭证) | 云消息队列 MQTT 版颁发的临时访问凭证,代表单一客户端对特定资源的访问权限。 |
应用服务器 | 您管理本地账号的服务器,用来替客户端申请和管理Token服务的应用。 |
MQTT服务器 | 云消息队列 MQTT 版权限认证和消息收发服务器,用来处理应用服务器发起的Token相关的请求以及消息收发业务。 |
使用流程
Token鉴权模式相比签名模式更加复杂,您需要按照下图所示的流程,部署您的应用服务器。而且在初始化时,MQTT客户端需要具备与您的应用服务器交互(获取和更新Token)的能力。
具体流程如下:
客户端启动时,需要先连接应用服务器验证身份。
客户端向应用服务器申请所需的所有Topic的权限。
应用服务器验证客户端是否有必要操作所需的Topic权限,如果验证通过则向云消息队列 MQTT 版服务器申请对应资源的Token。
云消息队列 MQTT 版服务器验证申请Token的请求,判断合法之后返回对应的Token。
应用服务器将返回的Token持久化到本地,对每个客户端需要的权限以及Token信息进行映射。缓存Token有以下优势:
客户端重新启动后再访问时,只要权限范围没有变化,应用服务器可以返回缓存的Token,避免重复申请。
客户端重新申请Token时,如果MQTT服务器异常,应用服务器可以尝试返回客户端之前申请的Token以实现本地容灾。
MQTT客户端按照规范将Token作为参数设置,连接MQTT服务器,服务端验证通过后客户端即可正常收发消息。
客户端正常收发消息。如果服务端判断Token失效,即会触发鉴权失败,断开连接,客户端应该重新发起申请Token的请求。
客户端行为约束
客户端从应用服务器拿到的信息除了Token本身,还需要获取Token的失效时间,以便本地计算何时提前刷新Token。
必须按照约定形式将Token作为连接参数设置到Password中,每次连接时上传。
客户端应该知晓自己使用的Token的时效性,确保不要使用过期的Token,否则服务端会断开连接。
客户端可以监听服务端下推的Token失效的通知消息,但服务端不保证通知一定触发,该通知仅供排查问题使用。
客户端应该对应用服务器返回的Token做持久化,避免每次重连都申请一样的Token,防止大批量客户端同时连接压垮应用服务器。
客户端更新Token可以选择关闭旧的客户端连接,然后重新使用新的Token来连接,也可以选择使用MQTT提供的系统Topic动态上传更新Token。如果选择动态更新Token,需要保证本地的配置也同步更新,以供下次连接初始化使用。
应用服务器行为约束
应用服务器必须验证自己的客户端是否合法,避免客户端冒用身份申请Token。
应用服务器应该对Token和客户端的关系、已分配的Token、对应权限内容以及生效时间进行管理,避免同一个客户端重复调用。
应用服务器将Token返回给客户端的同时,也应该告知客户端当前Token的操作权限以及过期时间,以便客户端提前刷新Token。
应用服务器需要做本地容灾,避免因MQTT服务器访问短暂不可用而导致业务阻塞的情况。
相关API
Token鉴权流程通过相关的API来完成。
应用服务器负责Token的申请和吊销管理,和云消息队列 MQTT 版服务器之间通过HTTPS的OpenAPI进行交互。
每个接口都要求通过AccessKey和请求签名来做身份验证。目前开放申请Token、吊销Token以及校验Token接口。详细信息,请参见Token应用服务器接口。
云消息队列 MQTT 版客户端则包括动态更新Token、监听Token失效信息,以及监听Token非法信息三个接口。详细信息,请参见Token客户端接口。