向Amazon web服务REST api发出请求时,无法使请求签名工作

Making requests to Amazon web services REST APIs, cannot get the request Signature to work

本文关键字:请求 工作 服务 web REST api Amazon      更新时间:2023-09-26

所以我试图向亚马逊的产品API发出请求,但我不知道如何获得签名工作。我正在关注另一篇堆栈溢出的文章,可以在这里找到:如何用Javascript为AWS创建签名?但仍不能满足我的要求。这是我正在发送的请求,(目前正在通过邮递员测试)。

http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[MY_ACCESSKEY]&Operation=ItemSearch&Keywords=the%20hunger%20games&SearchIndex=Books &Timestamp=2016-09-09T12:00:00Z&Signature=9RTSas234dfRTs3R%ErA8%

我编造了一个假签名,类似于我从这个函数得到的签名:

let service = "AWSECommerceService";
let timestamp = "2016-09-09T12:00:00Z";
let operation = "ItemSearch";
let secret = "MY_AMAZONSECRET";
let signature = CryptoJS.HmacSHA1(service + operation + timestamp, secret).toString(CryptoJS.enc.Base64);
console.log(signature);

记录到控制台的结果如下所示:9RTSas234dfRTs3R+ErA8=

从我在这里读到http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html,我认为你需要将'+'和'='替换为'%'符号。当我保持+和=符号不变时,我从AWS得到以下响应:

<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
    <Error>
        <Code>SignatureDoesNotMatch</Code>
        <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
    </Error>
    <RequestId>{MY_REQUESTID}</RequestId>
</ItemSearchErrorResponse>

但是当我将它们更改为%'s时,我得到了这样的响应:

<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
    <Error>
        <Code>MissingParameter</Code>
        <Message>The request must contain the parameter Signature.</Message>
    </Error>
    <RequestId>{MY_REQUESTID}</RequestId>
</ItemSearchErrorResponse>

即使请求中存在Signature参数。我该怎么解决这个问题。我使用crypto-js来创建签名,可以在这里找到:https://www.npmjs.com/package/crypto-js

我认为你需要将'+'和'='替换为'%'符号。

是的,但你不能只是用%代替它们。使用这个映射:

+ becomes %2B
/ becomes %2F
= becomes %3D

这被称为url编码、url转义或百分比编码。这些字符被替换为文字%,后面跟着它们的2位十六进制ASCII等价物。

9RTSas234dfRTs3R+ErA8= becomes 
9RTSas234dfRTs3R%2BErA8%3D