JS调用腾讯云 OCR TC3-HMAC-SHA256

本文详细介绍了如何使用JavaScript调用腾讯云OCR服务,重点讲解了TC3-HMAC-SHA256签名算法的实现步骤,包括依赖库的引入、HTTP请求头的构造以及签名过程。文中提到了在处理时间戳时,由于时区差异可能导致的校验失败问题,并给出了解决方案。

JS调用腾讯云 OCR

分享一下,之前在项目里调用ocr的经验,

第一步
npm install sha256
npm install crypto-js

第二步
import HmacSHA256 from ‘crypto-js/hmac-sha256’;
import Hex from ‘crypto-js/enc-hex’;
import sha256 from ‘crypto-js/sha256’;
import util from ‘./util.js’

const service = “ocr”;
const host = “ocr.tencentcloudapi.com”;
const region = “ap-guangzhou”;
const action = “IDCardOCR”;
const version = “2018-11-19”;
const algorithm = “TC3-HMAC-SHA256”;
const HTTPRequestMethod = ‘POST’;

const tencentcloudOcrUrl = “https://ocr.tencentcloudapi.com”;

function productAuthorization(jsonData,timeStamp) {
// 第一步
// HTTP 请求方法(GET、POST )本示例中为 GET;
// let curTimeStamp = timeStamp * 1000;
let date = new Date().toISOString().substr(0,10);
console.log("timeStamp = “+timeStamp +” date : "+date);
// URI 参数,API 3.0 固定为正斜杠(/)
let CanonicalURI = ‘/’;
// CanonicalQueryString:发起 HTTP 请求 URL 中的查询字符串,对于 POST 请求,固定为空字符串,对于 GET 请求,则为 URL 中问号(?)后面的字符串内容,本示例取值为:Limit=10&Offset=0。注意:CanonicalQueryString 需要经过 URL 编码。
let CanonicalQueryString = ‘’;
// 参与签名的头部信息,至少包含 host 和 content-type 两个头部,也可加入自定义的头部参与签名以提高自身请求的唯一性和安全性。拼接规则:1)头部 key 和 value 统一转成小写,并去掉首尾空格,按照 key:value\n 格式拼接;2)多个头部,按照头部 key(小写)的字典排序进行拼接。此例中为:content-type:application/x-www-form-urlencoded\nhost:cvm.tencentcloudapi.com\n
let CanonicalHe

<think>嗯,用户想知道如何在Postman中手动实现腾讯云WebSocket服务的TC3-HMAC-SHA256签名。首先,我需要回忆一下腾讯云的签名机制。TC3-HMAC-SHA256腾讯云API 3.0的签名方法,用于验证请求的合法性。对于WebSocket服务,签名需要放在请求头中,特别是在Authorization字段里。 首先,用户可能不太清楚签名生成的具体步骤。根据腾讯云文档,签名过程分为几个关键步骤:构造规范请求、生成待签字符串、计算签名、组装Authorization头。每个步骤都需要特定的参数和处理方式。 构造规范请求时,需要将HTTP请求方法、URI、查询参数、请求头和签名头等信息规范化。对于WebSocket,通常使用GET方法,URI是路径如/websocket,查询参数可能包括Action、Version和其他必要参数。然后,规范请求的哈希处理需要使用SHA256算法。 接下来是生成待签字符串,这包括签名算法、请求时间、凭证范围和规范请求的哈希值。请求时间需要是UTC时间,格式如2023-10-01T00:00:00Z。凭证范围通常由日期、服务名和请求类型组成,比如tc3_request。 计算签名部分需要多次使用HMAC-SHA256。首先是派生签名密钥,使用SecretKey对日期、服务名和请求类型进行三次哈希。然后用这个签名密钥对待签字符串进行哈希,得到最终的签名。 然后,组装Authorization头,格式为TC3-HMAC-SHA256加上各个凭证部分,比如SecretId、签名时间、凭证范围和签名本身。 用户想在Postman中手动实现这个,可能需要使用Pre-request Script来动态生成签名。需要获取当前的UTC时间,处理查询参数,规范请求的各个部分,然后进行多次HMAC计算。还要注意将生成的签名正确添加到请求头中,特别是Authorization和X-TC-Timestamp等字段。 可能遇到的问题包括时间格式不正确、HMAC密钥派生步骤错误、或者规范请求的哈希值计算有误。需要确保每一步都严格按照腾讯云的文档来实现,特别是各个字符串的拼接顺序和哈希处理的正确性。 另外,用户可能需要替换示例中的占位符,如SecretId、SecretKey、地域和服务名。测试的时候需要检查返回的鉴权失败信息,确认签名是否正确生成,时间是否同步,以及参数是否遗漏。 最后,生成相关问题时要考虑用户可能想进一步了解的优化方法、调试技巧或者不同场景下的应用,比如如何自动化签名生成,或者如何处理签名中的常见错误。</think>### 腾讯云WebSocket TC3-HMAC-SHA256签名生成步骤 #### 1. 签名核心参数 - **SecretId**:云API密钥ID - **SecretKey**:云API密钥 - **Service**:服务名称(如`wss`) - **Region**:地域(如`ap-guangzhou`) - **Timestamp**:当前UTC时间戳(如`1717560000`) - **Algorithm**:固定`TC3-HMAC-SHA256` #### 2. 签名生成流程 ```javascript // Postman Pre-request Script const crypto = require(&#39;crypto&#39;); // 配置参数 const secretId = &#39;AKIDz8*****&#39;; const secretKey = &#39;Gu5*****&#39;; const service = &#39;wss&#39;; const region = &#39;ap-guangzhou&#39;; const timestamp = Math.floor(Date.now() / 1000); const date = new Date(timestamp * 1000).toISOString().substr(0, 10); // 步骤1:构造规范请求 const httpRequestMethod = &#39;GET&#39;; const canonicalUri = &#39;/websocket&#39;; const canonicalQueryString = &#39;Action=SendMessage&Version=2020-04-01&#39;; const canonicalHeaders = &#39;content-type:application/json\nhost:service.domain.com\n&#39;; const signedHeaders = &#39;content-type;host&#39;; const hashedRequestPayload = crypto.createHash(&#39;sha256&#39;).update(&#39;&#39;).digest(&#39;hex&#39;); const canonicalRequest = [ httpRequestMethod, canonicalUri, canonicalQueryString, canonicalHeaders, signedHeaders, hashedRequestPayload ].join(&#39;\n&#39;); // 步骤2:生成待签字符串 const credentialScope = `${date}/${service}/tc3_request`; const hashedCanonicalRequest = crypto.createHash(&#39;sha256&#39;).update(canonicalRequest).digest(&#39;hex&#39;); const stringToSign = [ &#39;TC3-HMAC-SHA256&#39;, timestamp, credentialScope, hashedCanonicalRequest ].join(&#39;\n&#39;); // 步骤3:计算签名 const getSignatureKey = (key, date, service) => { const kDate = crypto.createHmac(&#39;sha256&#39;, &#39;TC3&#39; + key).update(date).digest(); const kService = crypto.createHmac(&#39;sha256&#39;, kDate).update(service).digest(); return crypto.createHmac(&#39;sha256&#39;, kService).update(&#39;tc3_request&#39;).digest(); }; const signatureKey = getSignatureKey(secretKey, date, service); const signature = crypto.createHmac(&#39;sha256&#39;, signatureKey) .update(stringToSign) .digest(&#39;hex&#39;); // 步骤4:组装Authorization const authorization = [ &#39;TC3-HMAC-SHA256 Credential=&#39; + secretId + &#39;/&#39; + credentialScope, &#39;SignedHeaders=&#39; + signedHeaders, &#39;Signature=&#39; + signature ].join(&#39;, &#39;); // 设置Postman环境变量 pm.environment.set(&#39;tc3_signature&#39;, authorization); pm.environment.set(&#39;x_tc_timestamp&#39;, timestamp); ``` #### 3. 请求头配置 ```http GET /websocket?Action=SendMessage&Version=2020-04-01 HTTP/1.1 Host: service.domain.com Authorization: {{tc3_signature}} X-TC-Timestamp: {{x_tc_timestamp}} X-TC-Region: ap-guangzhou Content-Type: application/json ``` #### 4. 验证要点 1. **时间同步**:确保服务器时间误差不超过5分钟[^1] 2. **密钥保护**:SecretKey需通过环境变量存储 3. **参数编码**:URL参数需进行URL编码 4. **服务标识**:不同服务需修改`service`参数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值