本文介绍云消息队列 MQTT 版终端和云端鉴权的常见问题。

终端鉴权

云端鉴权

Token鉴权和一机一密鉴权如何选择?

  • Token模式

    如果业务上需要对每个MQTT客户端的权限进行细致划分,或者仅需要对客户端授予临时的有时间期限的权限,则可以通过Token模式这种临时凭证访问方式实现。通过Token服务,您可以设置单一客户端访问的资源内容、权限级别和权限过期时间。

  • 一机一密模式

    一机一密给予MQTT客户端能够以独立的用户名、密码来进行身份识别的能力,帮助您解决客户端在不安全场景下,存在Token冒认的问题。且在一机一密模式下,用户名、密码与ClientId绑定,您可独立管理。

使用Token鉴权模式,客户端连接断开并返回“resource auth failed”错误。

使用的Token缺少对指定Topic的发布或订阅权限。您可以调用ApplyToken接口为Token授权。

申请Token权限能同时赋予多种权限吗?

不能,一次只能对同一批资源赋予一种权限。如果想对TopicA授予写权限,对TopicB授予读权限,需要调用两次 ApplyToken接口分别授权。

为什么已经调用Token授权了,还是鉴权失败?

客户端需要等到确认Token更新成功后再进行发布或订阅操作,否则可能会导致鉴权失败。

如何针对Token进行监控?

Token失效过期前5分钟会给客户端推送过期提醒信息,到期后会自动断连。过期提示如下,您可以直接监控$SYS/tokenInvalidNotice Topic来接收通知,根据通知里的code判断鉴权失败的原因。

$SYS/tokenExprireNotice,body is {"exprireTime":1655798142873,"type":"RW"}

ApplyToken接口一次最大可操作多少资源?

默认每个Token最多一次操作100个资源。如果您的实例为铂金版,您可以申请提高上限值。如需申请,请联系云消息队列 MQTT 版技术支持,钉钉群号:35228338。

调用注册访问凭证接口返回“deviceCredential num exceed”错误。

设备访问凭证的配额与实例规格中的连接数对等,达到配额上限后将无法为新设备申请访问凭证,您可以通过为实例升配提高访问凭证的配额,具体操作,请参见实例升降配

使用一机一密认证方式时,对于不再使用的设备凭证,请您及时调用UnRegisterDeviceCredential接口注销设备访问凭证,以免占用访问凭证的配额。

一机一密中Password的签名计算方法是什么?

Charset charset = Charset.forName("UTF-8");          
Mac mac = Mac.getInstance("HmacSHA1");          
mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm));          
byte[] bytes = mac.doFinal(text.getBytes(charset));         
return new String(Base64.encodeBase64(bytes), charset);

最终得到的Base64编码的字符串即为Password。

为什么给Group配置拒绝发布权限,依然可以发布消息?

给指定Group授予拒绝发布的权限(Deny mq:PUB),该Group依然可以用于发布消息。

您需要重新连接下客户端,Group的权限仅在客户端重连时校验。

自定义权限策略是否支持多级Topic?

自定义权限策略,支持将权限精确到多级Topic。