人
我一直在工作(嗯,刚刚开始)一个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>
答案 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。