为什么OpenSearch GET请求报签名不匹配错误但PUT请求正常
问题根因与修复方案
你遇到的签名不匹配问题由以下两个核心原因导致,按优先级修改即可:
GET请求携带请求体不符合签名规则
AWS SigV4签名逻辑默认不会将GET请求的请求体纳入签名计算,但OpenSearch服务端收到带请求体的GET请求时,会把请求体纳入签名校验,两边计算逻辑不一致就会返回403签名错误。
修复方法非常简单:把HttpRequest的method字段从GET改成POST即可,_search原生支持POST方法携带查询参数,完全兼容你当前的请求体结构。哈希包使用不匹配当前运行环境
你代码中引入的@aws-crypto/sha256-browser是浏览器端使用的哈希实现,Node.js环境下请替换为@aws-crypto/sha256-js,避免环境差异导致的哈希计算错误。
你需要先执行安装命令:
npm install @aws-crypto/sha256-js
然后替换代码中的引入语句:
// 替换原来的sha256-browser引入 const { Sha256 } = require('@aws-crypto/sha256-js')
修正后的核心代码片段
async function searchIndex (query) { const request = new HttpRequest({ body: JSON.stringify(createBody(query)), headers: { 'Content-Type': 'application/json', host: domain }, hostname: domain, method: 'POST', // 这里把GET改成POST path: `/${index}/${type}` // 路径前加/避免拼接异常 }) // 后续签名逻辑保持不变即可 }
修改完成后重新运行即可正常调用_search接口。
内容的提问来源于stack exchange,提问作者jsindos
相关产品推荐
相关产品推荐

