add api validation signature

This commit is contained in:
landaiqing
2024-09-28 00:21:30 +08:00
parent d6741aaa6f
commit f358e0d26a
8 changed files with 122 additions and 130 deletions

View File

@@ -10,6 +10,7 @@ import {message, Modal} from "ant-design-vue";
import i18n from "@/locales";
import {axiosRequestAdapter} from "@alova/adapter-axios";
import {refreshToken} from "@/api/user";
import createMD5Signature, {generateNonce} from "@/utils/signature/signature.ts";
let hasShownNetworkError: boolean = false;
const {onAuthRequired, onResponseRefreshToken} = createServerTokenAuthentication<typeof VueHook,
@@ -59,6 +60,15 @@ export const service = createAlova({
}
const lang = useStore().lang;
method.config.headers['Accept-Language'] = lang.lang || 'zh';
// 添加签名
if (method.type === 'POST') {
const nonce: string = generateNonce(); // 生成随机的 Nonce
const {signature, timestamp}: { signature: string, timestamp: number } = createMD5Signature(method, nonce);
method.config.headers['X-Sign'] = signature;
method.config.headers['X-Timestamp'] = timestamp;
method.config.headers['X-Nonce'] = nonce;
}
}),
// 响应拦截器
responded: onResponseRefreshToken({

View File

@@ -0,0 +1,33 @@
import CryptoJS from 'crypto-js';
/**
* 生成 MD5 签名
* @param method
* @param nonce
*/
export default function createMD5Signature(method: any, nonce: string) {
const secretKey: string = "38h0ex04du8qqf9ar2knn1quicdsm4s0"; // 密钥
const timestamp: number = Date.now(); // 获取当前时间戳
const payload: string = JSON.stringify(method.data || {}); // 获取请求数据
// 创建待签名字符串
const baseString: string = `${method.type}:${payload}:${timestamp}:${nonce}:${secretKey}`;
// 生成 MD5 签名
const signature: string = CryptoJS.MD5(baseString).toString();
// 你可以根据需要返回包含时间戳的签名对象
return {
signature,
timestamp,
nonce
};
}
/**
* 生成随机字符串作为 nonce
*/
export function generateNonce() {
return Math.random().toString(36).substring(2, 16); // 生成16位随机字符串
}