【葵花宝典】- 在 Apifox 中使用前置脚本实现腾讯云 API 签名

504 阅读3分钟

【葵花宝典】- 在 Apifox 中使用前置脚本实现腾讯云 API 签名

最近刚接触到接口调试神器 Apifox。然后抽空研究了下这个神器的一些操作~ 真的很哇塞

这两天对接的产品是腾讯云混元大模型的接口,然后由于腾讯云 API 的安全性极高,为确保请求的真实性和安全性,要求对每个请求都必须进行签名验证。这就很让人头疼。 我知道你很急!不过请你先别着急~ 我已踩过坑了。下面我就将我的“葵花宝典"贡献给大家!

通过本教程,你将学会如何在 Apifox 中设置和生成必要的签名,以成功调用腾讯云的 API。

1. 准备工作

在开始之前,你需要确保已经拥有腾讯云的 API 密钥,包括:

  • SecretId
  • SecretKey

这些可以在腾讯云控制台的 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 签名的方法。这一技能将帮助你在开发中安全、有效地调用腾讯云的服务。如果你在实现过程中遇到任何问题,不妨回顾一下每一步的设置,或者查阅腾讯云的官方文档获取更多帮助。