调用物联网平台云端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
目录
相关文章
|
2月前
|
缓存 JavaScript 前端开发
深入浅出:使用Node.js构建RESTful API
【9月更文挑战第3天】在数字化浪潮中,后端开发如同搭建一座连接用户与数据的桥梁。本文将带领读者从零开始,一步步用Node.js搭建一个功能完备的RESTful API。我们将探索如何设计API的结构、处理HTTP请求以及实现数据的CRUD操作,最终通过一个简单的实例,展示如何在真实世界中应用这些知识。无论你是初学者还是有一定经验的开发者,这篇文章都会为你揭示后端开发的奥秘,让你轻松入门并掌握这一技能。
96 3
|
4天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
15天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
35 4
|
8天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
1月前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
1月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
1月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
17 0
|
1月前
|
JSON JavaScript API
Node.js RESTful API
10月更文挑战第8天
13 0
|
1月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API
【10月更文挑战第3天】 使用 Node.js 和 Express 构建 RESTful API
|
1月前
|
Web App开发 JSON JavaScript
使用 Node.js 构建一个简单的 RESTful API
【10月更文挑战第3天】使用 Node.js 构建一个简单的 RESTful API

相关产品

  • 物联网平台