多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
为了应用的有效性,以及服务的安全性,特使用了应用验签,签名使用了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) } ```