javascript - 如何签署 AWS API 请求?

标签 javascript ajax amazon-web-services coffeescript meteor

各位。

我一直在开发(好吧,刚刚开始)一个 Web 应用程序,该应用程序将利用 Amazon Web Services 的图书搜索 Web API。

我的问题...是为了使用他们的 API,您必须使用 HMAC SHA 哈希对所有请求进行签名,并在将请求发送给他们时将签名哈希附加到您的查询中。

在阅读了我可以获得的文档后,我昨晚编写了一些代码,看来我没有使用我应该使用的哈希算法不正确地签署对 AWS API 的请求。

这是我当前用于访问他们的 API 的代码,为了我自己的安全,删除了所有 key :

Meteor.methods

    "isbnSearch": (isbn) ->

        ts = encodeURIComponent(new Date().toISOString())

        reqArray = [
            "Service=AWSCommerceService",
            "Operation=ItemLookup",
            "ResponseGroup=Medium%2CImages",
            "IdType=ISBN",
            "Timestamp="+ts,
            "AWSAccessKeyId=<Access Key Here>",
            "ItemId="+isbn,
            "Version=2014-08-02"
        ]

        req = reqArray.sort().join('&')

        stringToSign = "Get\nwebservices.amazon.com\n/onca/xml\n" + req
        theHash = CryptoJS.HmacSHA256(stringToSign, "<Secret Key Here>").toString()
        request = req + "&Signature=" + theHash
        reqURL = "http://webservices.amazon.com/onca/xml?" + request

        result = HTTP.get reqURL, (e, res) ->

            console.log res

我正在使用AWS提供给我的AWSAccessKeyId,以及相应位置的 key ,我想我只是散列了一些错误的东西。

任何帮助将不胜感激!

我从 AWS 得到的回复如下:

<?xml version="1.0"?>
    <ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2014-08-02/">
        <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>3377bde5-a006-429d-a1f6-8c4faf1b8efc</RequestId>
    </ItemLookupErrorResponse>

最佳答案

根据http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html (第 9 步)您需要对签名中的所有 + 和 = 进行编码。您似乎没有在代码中这样做。

关于javascript - 如何签署 AWS API 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104572/

相关文章:

amazon-web-services - SQS fifo 队列在用作 lambda 触发器时不能确保单次交付

javascript - 安装和使用 jquery 插件

javascript - 后面的空格转义字符\n

ajax - 如何在 Laravel 应用程序中获取实时更新

php - 我如何构建我的 PHP 项目?

amazon-web-services - Lambda 的 AWS 计划事件规则在 CloudFormation 中不起作用

javascript - Material UI 更改输入的事件颜色

javascript - 为什么我会收到一封空电子邮件?

javascript - 通过 API 获取 Instagram 当前的点赞和关注限制

java - AWS Fargate - 从本地无法连接到在 aws fargate 上运行的 java 应用程序的 jmx 端口