| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import { sign, hash as getHash, hex } from "./hmac";
- // 使用 SHA-256 和 secret 进行 HMAC 加密
- function sha256(message: any, secret: any, encoding?: string) {
- const result = sign(secret, message);
- return encoding == "hex" ? hex(result).toString() : result;
- }
- function getDate(timestamp: number) {
- 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}`;
- }
- export async function getHeader(
- payload: any,
- SECRET_ID: string,
- SECRET_KEY: string,
- ) {
- // https://cloud.tencent.com/document/api/1729/105701
- const endpoint = "hunyuan.tencentcloudapi.com";
- const service = "hunyuan";
- const region = ""; // optional
- const action = "ChatCompletions";
- const version = "2023-09-01";
- const timestamp = Math.floor(Date.now() / 1000);
- //时间处理, 获取世界时间日期
- const date = getDate(timestamp);
- // ************* 步骤 1:拼接规范请求串 *************
- const hashedRequestPayload = getHash(payload);
- const httpRequestMethod = "POST";
- const contentType = "application/json";
- const canonicalUri = "/";
- const canonicalQueryString = "";
- const canonicalHeaders =
- `content-type:${contentType}\n` +
- "host:" +
- endpoint +
- "\n" +
- "x-tc-action:" +
- action.toLowerCase() +
- "\n";
- const signedHeaders = "content-type;host;x-tc-action";
- const canonicalRequest = [
- httpRequestMethod,
- canonicalUri,
- canonicalQueryString,
- canonicalHeaders,
- signedHeaders,
- hashedRequestPayload,
- ].join("\n");
- // ************* 步骤 2:拼接待签名字符串 *************
- const algorithm = "TC3-HMAC-SHA256";
- const hashedCanonicalRequest = getHash(canonicalRequest);
- const credentialScope = date + "/" + service + "/" + "tc3_request";
- const stringToSign =
- algorithm +
- "\n" +
- timestamp +
- "\n" +
- credentialScope +
- "\n" +
- hashedCanonicalRequest;
- // ************* 步骤 3:计算签名 *************
- const kDate = sha256(date, "TC3" + SECRET_KEY);
- const kService = sha256(service, kDate);
- const kSigning = sha256("tc3_request", kService);
- const signature = sha256(stringToSign, kSigning, "hex");
- // ************* 步骤 4:拼接 Authorization *************
- const authorization =
- algorithm +
- " " +
- "Credential=" +
- SECRET_ID +
- "/" +
- credentialScope +
- ", " +
- "SignedHeaders=" +
- signedHeaders +
- ", " +
- "Signature=" +
- signature;
- return {
- Authorization: authorization,
- "Content-Type": contentType,
- Host: endpoint,
- "X-TC-Action": action,
- "X-TC-Timestamp": timestamp.toString(),
- "X-TC-Version": version,
- "X-TC-Region": region,
- };
- }
|