文章摘自 利用Nodejs生成阿里云API签名 | 一个前端开发的踩坑小报告 自己又详细一下它
一.随机数和时间数的生成 使用moment插件
二.签名的生成
传入参数 形式如下:
var ret = {
Action: 'GetPlayInfo',
VideoId: '',
Format: 'JSON',
Version: '2017-03-21',
AccessKeyId: '',
SignatureMethod: 'HMAC-SHA1',
Timestamp: timestamp,
SignatureVersion: '1.0',
SignatureNonce: signaturenonce,
}
(可能会遇到的问题 本人遇到了 当报签名不匹配的时候 原因可能是签名base64的时候解析出来带加号的签名 这个时候需要将返回的签名的加号替换为%2B)(url会将加号替换为空格导致)
params.Signature = Signture.replace(/\+/g,'%2B');
下面代码直接的放一个地方require即可:
constquerystring =require('querystring');
constcrypto =require("crypto");
module.exports=functiongetSignatureParams(params){
StringToSign ="GET"+"&"+ percentEncode("/") +"&"+ percentEncode(uriSort(params))
var Signture = getSignture(StringToSign);
params.Signature = Signture;
return params;//返回带签名的完整uri
}
functionpercentEncode(str){//百分比编码 uri
var s =encodeURI(str);
returns
.replace(/ /g,"%20")
.replace(/\//g,"%2F")
.replace(/\+/g,"%20")
.replace(/\*/g,"%2A")
.replace(/\%7E/g,"~")
.replace(/\=/g,"%3D")
.replace(/\&/g,"%26")
.replace(/\:/g,"%253A")
}
functiongetSignture(Signature){//计算HMAC
returncrypto
.createHmac('sha1',"testsecret&")//你的secret
.update(Signature)
.digest()
.toString('base64');
}
functionuriSort(uri){//uri参数排序
vararr = 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;
}
网友评论