如何签署AWS API请求?

时间:2014-08-03 12:21:19

标签: javascript ajax amazon-web-services coffeescript meteor

我一直在工作(嗯,刚刚开始)一个Web应用程序,它将利用来自Amazon Web Services的书籍搜索Web API。

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

我昨晚写了一些代码,在阅读了我可以获得的文档之后,似乎我使用这种哈希算法不正确地将我的请求签名到AWS API我应该是使用

这是我目前用于访问其API的代码,为了我自己的安全性删除了任何密钥:

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,以及各个地方的秘密密钥,我想我只是在做错了。

非常感谢任何帮助!

我从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>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

我建议使用现有的Meteorite aws-sdk软件包之一:https://atmospherejs.com/?q=aws

他们添加对AWS Node.js SDK的访问权限。

您还可以添加NPM Meteorite包(http://atmospherejs.com/package/npm)以访问AWS Node.js SDK。