网站首页linux
js接口签名及后端验签
发布时间:2023-03-22 12:14:21编辑:slayer.hover阅读(416)
1. 前端js,拼接接口参数,生成签名sign
第一步: 安装 crypto-js
npm install crypto-js
第二步:引入CryptoJS
import CryptoJS from 'crypto-js'
第三步: 生成签名
let params = {
param1: '111',
param2: '222',
...
timestamp: Date.now(),
};
params.sign= generateSign(params);
request({
url,
params
})
function generateSign(param) {
let paramKeys = Object.keys(param);
let paramArr = [];
paramKeys.forEach(function (value, key) {
let typeVal = typeof(param[value]);
if (value!='sign' && param[value] !== undefined &&
param[value] !== null && param[value] !== '' && typeVal!=='object' ){
let oneItem = value+'='+param[value];
paramArr.push(oneItem);
}
});
let paramStr = paramArr.sort().join("&");
let secretKey = '11111111111111111111111'; //与后端secretKey保持一致
return CryptoJS.HmacSHA256(paramStr, secretKey).toString();
}2. 后端验证签名
在PHP后端接口入口处, 或中间件中加入验签方法
function checkSign($params) {
$sign = $params['sign'];
unset($params['sign']);
ksort($params);
foreach ($params as $paramKey => $paramVal)
{
if(is_array($paramVal) || $paramVal === null || $paramVal === '')continue;
$paramStr .= $paramKey.'='.$paramVal.'&';
}
$paramStr = substr($paramStr, 0, -1);
$secretKey = '11111111111111111111111'; //与前端secretKey保持一致
$mySign = hash_hmac('sha256', $paramStr, $secretKey);
if($mySign!==$sign) {
throw new \Exception('异常请求', 403);
}
}
评论