# 设备配置鉴权

设备配置平台在设计实现的过程中,始终把安全摆在第一位。设备配置平台对外开放基于HTTP协议的Restful API(简称API),通过这些API可以上传设备配置、获取配置版本信息、拉取配置等。为避免相关操作被恶意调用,平台对所有相关操作都进行了权限控制,只有鉴权通过才可以进一步操作。

# 分级鉴权

为方便权限精细化管理,同时为减小权限不小心外泄的影响,平台对鉴权部分进行分级管理,主要分为2级:

  1. 设备级鉴权
  2. 配置空间级鉴权

权限的分级具体细节请参考API说明文档,会描述某个API可用权限。

# 设备级鉴权

设备级鉴权采用设备配置的secret对api请求参数进行签名鉴权。

设备上传配置并首次拉取配置后,用户可通过登陆瀚云物联网平台->设备配置页面->配置空间->设备列表->设备详情,查看自己的鉴权信息;

也可以通过公网api获取最新版本接口,通过首次调用获取到secret。

设备级鉴权

# 配置空间级权限

配置空间级鉴权采用配置空间的token对api请求参数进行签名鉴权。

用户可通过登陆瀚云物联网平台->设备配置页面->配置空间,查看token,该token用于鉴权使用;

如果没有配置空间信息,可以手动添加,后台会自动分配token。

配置空间级鉴权

# 签名鉴权步骤

# 生成签名字符串

①以{key}={value}的方式将所有请求参数进行拼接(不包含sign字段),并放入字符串数组中。

②对字符串数组根据字符串ASCII码值进行正向排序。

③将字符串数组数据使用 & 字符进行拼接。

组装前请求参数示例:

{
    "spaceKey": "tudy01q0",
    "sn": "1234567890007",
    "time": 1631523954270,
    "nonce": "dJcDknCCqpTGkxyz"
}

组装后的字符串示例:

nonce=dJcDknCCqpTGkxyz&sn=1234567890007&spaceKey=tudy01q0&time=1631523954270

# HMAC-SHA1签名

使用hmac-sha1算法对上述生成的拼接字符串,使用对应的密钥(设备级secret或配置空间级token)进行签名,并进行Base64编码

具体算法代码示例:

    private static final String HMAC_SHA1 = "HmacSHA1";
    private final static String CHARSET_UTF8 = "utf-8";
    
    public static String signWithHmacsh1(String secret, String content) {
        try {
            Mac mac = Mac.getInstance(HMAC_SHA1);
            byte[] keyBytes = secret.getBytes(StandardCharsets.UTF_8);
            SecretKey secretKey = new SecretKeySpec(keyBytes, HMAC_SHA1);
            mac.init(secretKey);

            byte[] rawHmac = mac.doFinal(content.getBytes(StandardCharsets.UTF_8));
            return new BASE64Encoder().encode(rawHmac);
        } catch (Exception e) {
            logger.error("sign with hmacsh1 error", e);
            return null;
        }
    }

通过以上算法即可得到sign字段的值。

签名后的sign示例:

Yefmm4ltlnmcsPmzzpXSmCsIbmw=

# 最终的请求参数

{
    "spaceKey": "tudy01q0",
    "sn": "1234567890007",
    "time": 1631523954270,
    "nonce": "dJcDknCCqpTGkxyz",
    "sign": "Yefmm4ltlnmcsPmzzpXSmCsIbmw=",
}