为了应用的有效性,以及服务的安全性,特使用了应用验签,签名使用了sha1加密。
签名参数包含
AppId
AppSecret
timestamp 当前时间戳
signaturenonce 随机字符串
提交时的签名signature由以上参数排序后sha1加密而来的。
生成签名的时候需要用到AppSecret,但是提交请求的时候不提交AppSecret
会在服务端获取正确的AppSecret后生成签名,进行对比验签
关键代码如下
```
// 生成签名
const getSign = function(data) {
// 这只是一个简单的鉴权功能,适用于app和小程序,h5尽量不要使用,appsecret明文泄密(可以尝试JS混淆加密),形同虚设。
// 客户端:获取签名的流程 取得当前时间戳timestamp,随机字符串SignatureNonce,配合上appid和appsecret组成一个对象,和传过来的data参数合并,序列化后用sha1加密的到的就是signature签名,注意appsecret不传递到服务器
// 服务端解密:信息通过header传递,服务器获取后,根据传递的appid 查询 appsecret,查询不到直接出抛异常,再合上传递过去的所有参数,序列化sha1加密后和signature对比,如果一致则验签通过。
let Sign, timestamp = parseInt((new Date()).getTime() / 1000), SignatureNonce;
//生成SignatureNonce,可以在这里处理一下
SignatureNonce = sha1("lwwan_key_" + getrandomNum(5) + getrandomNum(6));
let str = {
appid: AppId,
timestamp: timestamp,
appsecret: config.MARK,
signaturenonce: SignatureNonce,
}
//合并参数
var objstr = jsonSort(getExtend(str,data));
Sign = {
appid: AppId,
signaturenonce: SignatureNonce,
timestamp: timestamp,
signature: sha1(objstr) //签名
}
return Sign;
}
// 随机数
const getrandomNum = function(num) {
let rnd = "";
for (let i = 0; i < num; i++)
rnd += Math.floor(Math.random() * 10);
return rnd;
}
// 合并对象
const getExtend = function(target, source) {
for (var obj in source) {
target[obj] = source[obj];
}
return target;
}
// 对象序列化
function jsonSort(jsonObj) {
let arr = [];
for (var key in jsonObj) {
arr.push(key)
}
arr.sort();
let str = '';
for (var i in arr) {
str += arr[i] + "=" + jsonObj[arr[i]] + "&"
}
return str.substr(0, str.length - 1)
}
```