- 作者:老汪软件技巧
- 发表时间:2024-11-14 00:02
- 浏览量:
【葵花宝典】- 在 Apifox 中使用前置脚本实现腾讯云 API 签名
最近刚接触到接口调试神器 Apifox。然后抽空研究了下这个神器的一些操作~ 真的很哇塞
这两天对接的产品是腾讯云混元大模型的接口,然后由于腾讯云 API 的安全性极高,为确保请求的真实性和安全性,要求对每个请求都必须进行签名验证。这就很让人头疼。我知道你很急!不过请你先别着急~我已踩过坑了。下面我就将我的“葵花宝典"贡献给大家!
通过本教程,你将学会如何在 Apifox 中设置和生成必要的签名,以成功调用腾讯云的 API。
1. 准备工作
在开始之前,你需要确保已经拥有腾讯云的 API 密钥,包括:
这些可以在腾讯云控制台的 API 密钥管理页面获取。请妥善保管这些密钥,避免泄露。
2. 在 Apifox 中设置项目
首先,在 Apifox 中创建一个新项目,然后添加一个 API 请求。在这个请求中,你需要填写腾讯云 API 的 URL、请求方法等基本信息。
3. 实现签名机制
签名的生成是调用腾讯云 API 时最关键的步骤。以下是生成签名的详细步骤:
步骤 3.1: 确定请求参数
包括所有必要的请求参数,例如操作名称、版本号等。
步骤 3.2: 构造请求字符串
将所有请求参数按照字典序排序,并使用 &连接成一个字符串。
步骤 3.3: 生成签名字符串
使用 HMAC-SHA256 算法,结合你的 SecretKey,对步骤 3.2 中得到的字符串进行签名。
步骤 3.4: 添加签名到请求参数
将生成的签名添加到请求参数中。
在 Apifox 中,你可以使用“前置脚本”功能来自动化这一过程。以下是一个 JavaScript 脚本示例,用于生成签名并将其添加到请求参数中:
前提:需要在环境变量中设置 SECRET_ID、SECRET_KEY
const CryptoJS = require("crypto-js");
// SHA256 加密函数
function sha256(message, secret = "") {
const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secret);
return hmac.update(message).finalize();
}
// 计算消息的 SHA256 哈希值
function getHash(message) {
const hash = CryptoJS.SHA256(message);
return hash.toString(CryptoJS.enc.Hex);
}
// 根据时间戳获取日期字符串
function getDate(timestamp) {
const date = new Date(timestamp * 1000);
const year = date.getUTCFullYear();
const month = ("0" + (date.getUTCMonth() + 1)).slice(-2);
const day = ("0" + date.getUTCDate()).slice(-2);
return `${year}-${month}-${day}`;
}
// 签名请求函数
function signRequest(
secretId,
secretKey,
endpoint,
service,
action,
timestamp,
payload
) {
const date = getDate(timestamp);
const hashedRequestPayload = getHash(JSON.stringify(payload));
const httpRequestMethod = "POST";
const canonicalUri = "/";
const canonicalQueryString = "";
const canonicalHeaders = `content-type:application/json\nhost:${endpoint}\nx-tc-action:${action.toLowerCase()}\n`;
const signedHeaders = "content-type;host;x-tc-action";
const canonicalRequest = `${httpRequestMethod}\n${canonicalUri}\n${canonicalQueryString}\n${canonicalHeaders}\n${signedHeaders}\n${hashedRequestPayload}`;
const algorithm = "TC3-HMAC-SHA256";
const hashedCanonicalRequest = getHash(canonicalRequest);
const credentialScope = `${date}/${service}/tc3_request`;
const stringToSign = `${algorithm}\n${timestamp}\n${credentialScope}\n${hashedCanonicalRequest}`;
const kDate = sha256(date, `TC3${secretKey}`);
const kService = sha256(service, kDate);
const kSigning = sha256("tc3_request", kService);
const signature = sha256(stringToSign, kSigning, "hex");
const authorization = `${algorithm} Credential=${secretId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
return authorization;
}
// 生成curl命令
function generateCurlCommand(
endpoint,
authorization,
timestamp,
action,

version,
payload
) {
const curlCommand =
"curl -X POST " +
"https://" +
endpoint +
'\n -H "Authorization: ' +
authorization +
'"' +
'\n -H "Content-Type: application/json; charset=utf-8"' +
'\n -H "Host: ' +
endpoint +
'"' +
'\n -H "X-TC-Action: ' +
action +
'"' +
'\n -H "X-TC-Timestamp: ' +
timestamp.toString() +
'"' +
'\n -H "X-TC-Version: ' +
version +
'"' +
"\n -d '" +
JSON.stringify(payload) +
"'";
return curlCommand;
}
// 主函数
function main() {
try {
// 获取环境变量中的密钥
const SECRET_ID = pm.environment.get("SECRET_ID");
const SECRET_KEY = pm.environment.get("SECRET_KEY");
// 定义API的相关参数
const endpoint = "hunyuan.tencentcloudapi.com";
const service = "hunyuan";
const action = "ChatCompletions";
const version = "2023-09-01";
const timestamp = parseInt(Date.now() / 1000);
// 获取请求体并处理
const body = JSON.parse(pm.request.body.toJSON().raw);
console.log("body:", JSON.stringify(body));
// 签名请求
const authorization = signRequest(
SECRET_ID,
SECRET_KEY,
endpoint,
service,
action,
timestamp,
body
);
// 设置环境变量
pm.environment.set("Authorization", authorization);
pm.environment.set("X-TC-Timestamp", timestamp.toString());
// 生成并打印curl命令
const curlCommand = generateCurlCommand(
endpoint,
authorization,
timestamp,
action,
version,
body
);
console.log("curl:", curlCommand);
} catch (error) {
console.error("Error:", error);
}
}
main();
4. 发送请求并验证
完成签名后,你可以发送请求。如果一切设置正确,你应该能够看到腾讯云 API 的响应。
结语
通过本“葵花宝典”,你应该能够掌握在 Apifox 中实现腾讯云 API 签名的方法。这一技能将帮助你在开发中安全、有效地调用腾讯云的服务。如果你在实现过程中遇到任何问题,不妨回顾一下每一步的设置,或者查阅腾讯云的官方文档获取更多帮助。