Generate Aliyun API Signature with Node.js
To call Aliyun’s DNS API, you must generate the signature required by Aliyun. Signature Mechanism
I couldn’t find Node.js related code for getting signatures online. According to Aliyun’s requirements, I wrote a program myself to easily generate signatures.
const querystring = require('querystring');
const crypto = require("crypto");
module.exports=function getSignatureParams(params) {
StringToSign = "GET" + "&" + percentEncode("/") + "&" + percentEncode(uriSort(params))
var Signture = getSignture(StringToSign);
params.Signature = Signture;
return params; // Return complete uri with signature
}
function percentEncode(str) { // Percent encode uri
var s = encodeURI(str);
return s
.replace(/ /g, "%20")
.replace(/\//g, "%2F")
.replace(/\+/g, "%20")
.replace(/\*/g, "%2A")
.replace(/\%7E/g, "~")
.replace(/\=/g, "%3D")
.replace(/\&/g, "%26")
.replace(/\:/g, "%253A")
}
function getSignture(Signature) { // Calculate HMAC
// 47awTgVxfVEBL8hewkBgYD6kEvuJn0
return crypto
.createHmac('sha1', "testsecret&") // Your secret
.update(Signature)
.digest()
.toString('base64');
}
function uriSort(uri) { // Sort uri parameters
var arr = querystring.stringify(uri).split("&");
arr = arr.sort();
var str = "";
[].forEach.call(arr, function (s, i) {
if (i == (arr.length - 1)) {
str = str + s
} else {
str = str + s + "&"
}
});
return str;
}