前端请求设置签名
签名生成
import md5 from 'js-md5';
export default {
getBaseHeaders(data) {
let dataSort = this.sortByKey(data);
let dataStr = this.strJoin(dataSort);
let urlStr = window.location.origin;
let timestamp = new Date().getTime();
let nonceStr = Math.random().toString(36).substr(2);
let signature = md5(dataStr + '×tamp=' + timestamp + '&nonce=' + nonceStr + '&url=' + urlStr);
let postBaseHeaders = {
timestamp: timestamp,
nonce: nonceStr,
signature: signature,
};
return postBaseHeaders;
},
sortByKey(obj) {
const newkey = Object.keys(obj).sort();
let newObj = {};
for (let i = 0; i < newkey.length; i++) {
newObj[newkey[i]] = obj[newkey[i]];
}
return newObj;
},
strJoin(resData) {
let i = 0;
let str = '';
let strJoint = '';
let arr = Object.keys(resData);
for (let key in resData) {
str = key + '=' + resData[key];
i++;
if (i < arr.length) {
strJoint = strJoint + str + '&';
} else if (i == arr.length) {
strJoint = strJoint + str;
}
}
console.log(strJoint);
return strJoint;
},
};
axios应用
axios.interceptors.request.use(
(config: any) => {
let headers = getBaseHeaders({name: 'test'});
config = Object.assign(config, { headers });
return config;
},
(error: any) => {
return Promise.reject(error);
}
);
后端nodejs校验签名
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const md5 = require('js-md5');
const app = new Koa();
app.use(bodyParser());
app.use(async (ctx) => {
let url = ctx.headers.origin;
let timestamp = ctx.headers.timestamp;
let nonce = ctx.headers.nonce;
let signature = ctx.headers.signature;
let postData = ctx.request.body;
let dataSort = sortByKey(postData);
let dataStr = strJoin(dataSort);
let newSignature = md5(`${dataStr}&Timestamp=${timestamp}&nonce=${nonce}&url=${url}`);
if (signature === newSignature) {
ctx.body = {
code: 200,
msg: '签名校验成功',
data: 'true',
};
} else {
ctx.body = {
code: 4000,
msg: '签名校验失败',
data: 'false',
};
}
function sortByKey(obj) {
const newkey = Object.keys(obj).sort();
var newObj = {};
for (var i = 0; i < newkey.length; i++) {
newObj[newkey[i]] = obj[newkey[i]];
}
return newObj;
}
function strJoin(resData) {
let i = 0;
let str = '';
let strJoint = '';
var arr = Object.keys(resData);
for (let key in resData) {
str = key + '=' + resData[key];
i++;
if (i < arr.length) {
strJoint = strJoint + str + '&';
} else if (i == arr.length) {
strJoint = strJoint + str;
}
}
return strJoint;
}
});
const hostName = '127.0.0.1';
const port = 80;
app.listen(port, hostName, () => {
console.log(`服务运行在http://${hostName}:${port}`);
});
console.log('成功启动');