调用物联网平台云端api时的签名js实现

简介: 调用物联网平台云端api时的签名js实现。

物联网平台中调用云端api,js的签名实现如下,目前物联网平台支持的api列表

const crypto = require('crypto');
const urlencode = require('urlencode');
const moment = require("moment");
function timestamp() {
    var date = new Date();
    var time = moment(date).utcOffset(0).format("YYYY-MM-DDTHH.mm.ss");
    time += 'Z';
    console.log("date===" + date);
    console.log("time===" + time);
    // 删除掉毫秒部分
    return time;
}
function encode(str) {
    var result = urlencode(str, "utf8");
    return result.replace(/!/g, '%21')
        .replace(/'/g, '%27')
        .replace(/\(/g, '%28')
        .replace(/\)/g, '%29')
        .replace(/\*/g, '%2A');
}
function replaceRepeatList(target, key, repeat) {
    for (var i = 0; i < repeat.length; i++) {
        var item = repeat[i];
        if (item && typeof item === 'object') {
            const keys = Object.keys(item);
            for (var j = 0; j < keys.length; j++) {
                target[`${key}.${i + 1}.${keys[j]}`] = item[keys[j]];
            }
        } else {
            target[`${key}.${i + 1}`] = item;
        }
    }
}
function flatParams(params) {
    var target = {};
    var keys = Object.keys(params);
    for (let i = 0; i < keys.length; i++) {
        var key = keys[i];
        var value = params[key];
        if (Array.isArray(value)) {
            replaceRepeatList(target, key, value);
        } else {
            target[key] = value;
        }
    }
    return target;
}
function normalize(params) {
    var list = [];
    var flated = flatParams(params);
    var keys = Object.keys(flated).sort();
    for (let i = 0; i < keys.length; i++) {
        var key = keys[i];
        var value = flated[key];
        list.push([encode(key), encode(value)]);
    }
    return list;
}
function canonicalize(normalized) {
    var fields = [];
    for (var i = 0; i < normalized.length; i++) {
        var [key, value] = normalized[i];
        fields.push(key + '=' + value);
    }
    return fields.join('&');
}
var AccessKeyId = "";
var accessSecret = "";
/*
var str = "POST&%2F&AccessKeyId%3D" + AccessKeyId
    + "%26Action%3DQueryDevice%26Format%3DJSON%26ProductKey%3Da1tDKl1PBkl%26RegionId%3Dcn-shanghai%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D86439216304009%26SignatureVersion%3D1.0%26Timestamp%3D2021-12-28T06%253A37%253A48Z%26Version%3D2018-01-20";;
*/
var str = "";
var httpmethod = "POST";
var params = {};
params.Format = "JSON";
params.Version = "2018-01-20";
params.AccessKeyId = AccessKeyId;
params.SignatureMethod = "HMAC-SHA1";
//params.Timestamp = timestamp();
params.Timestamp = '2021-12-28T06:37:48Z';
params.SignatureVersion = "1.0";
params.SignatureNonce = "86439216304009";
params.Action = "QueryDevice";
params.ProductKey = "a1tDKl1PBkl";
params.RegionId = "cn-shanghai";
var normalized = normalize(params);
console.log("normalized===" + normalized);
var canonicalized = canonicalize(normalized);
console.log("canonicalized===" + canonicalized);
str = httpmethod + "&" + encode("/") + "&" + encode(canonicalized);
console.log("str===" + str);
var key = accessSecret + "&";
const signature = Buffer.from(crypto.createHmac('sha1', key).update(str).digest()).toString('base64');
console.log("signature==="+signature);
console.log("最终signature===" + encode(signature));
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
17天前
|
JSON API 数据处理
Winform管理系统新飞跃:无缝集成SqlSugar与Web API,实现数据云端同步的革新之路!
【8月更文挑战第3天】在企业应用开发中,常需将Winform桌面应用扩展至支持Web API调用,实现数据云端同步。本文通过实例展示如何在已有SqlSugar为基础的Winform系统中集成HTTP客户端调用Web API。采用.NET的`HttpClient`处理请求,支持异步操作。示例包括创建HTTP辅助类封装请求逻辑及在Winform界面调用API更新UI。此外,还讨论了跨域与安全性的处理策略。这种方法提高了系统的灵活性与扩展性,便于未来的技术演进。
76 2
|
1月前
|
API 开发工具
支付系统17------支付宝支付-----API预览以及签名验签说明,出现支付宝扫描二维码的操作,支付完成之后,查询订单的状态,支付成功之后,需要退款调用的接口,退款状态的接口,完成退款之后,通知
支付系统17------支付宝支付-----API预览以及签名验签说明,出现支付宝扫描二维码的操作,支付完成之后,查询订单的状态,支付成功之后,需要退款调用的接口,退款状态的接口,完成退款之后,通知
|
3月前
|
前端开发 API 数据安全/隐私保护
API接口签名验证
过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被泄露被他人获取,那么就会有非法请求的风险。其他人可以使用这个token自行调用接口进行请求,传入非法参数甚至进行注入攻击等,可能会造成严重的问题。
|
8月前
|
缓存 安全 NoSQL
App开放接口api安全:Token签名sign的设计与实现
在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些 接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目 中,大多数采用保存的session中,然后在存一份到cookie中,来保持用户的回话有效性。
|
11月前
|
JSON 物联网 API
嵌入式物联网开发之使用Json获取北京时间校准接口API
嵌入式物联网开发之使用Json获取北京时间校准接口API
341 1
|
11月前
|
存储 算法 JavaScript
微信支付-Native下单API支付封装+签名流程解读
微信支付-Native下单API支付封装+签名流程解读
137 0
|
资源调度 API 开发工具
在使用 SchedulerX 中的 SDK 进行 API 调用时,如果出现签名计算不对的错误
在使用 SchedulerX 中的 SDK 进行 API 调用时,如果出现签名计算不对的错误
202 1
|
传感器 数据可视化 物联网
漏刻有时物联网传感器API接口对接说明文档
漏刻有时物联网传感器API接口对接说明文档
61 0
|
监控 安全 物联网
【物联网安全】通过API管理最小化物联网安全失误
【物联网安全】通过API管理最小化物联网安全失误
拒绝接口裸奔!开放API接口签名验证
接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一?

相关产品

  • 物联网平台