# 设备配置鉴权
设备配置平台在设计实现的过程中,始终把安全摆在第一位。设备配置平台对外开放基于HTTP协议的Restful API(简称API),通过这些API可以上传设备配置、获取配置版本信息、拉取配置等。为避免相关操作被恶意调用,平台对所有相关操作都进行了权限控制,只有鉴权通过才可以进一步操作。
# 分级鉴权
为方便权限精细化管理,同时为减小权限不小心外泄的影响,平台对鉴权部分进行分级管理,主要分为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=",
}