我正在尝试使用此处提到的URL从Amazon Product API获取产品相关数据:
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemLookup.html
项目查询网址:
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[AWS_Access_Key_ID]&Operation=ItemLookup&ItemId=B00008OE6I&Timestamp=[YYYY-MM-DDThh:mm:ssZ]&Signature=[Request_Signature]
我在网址中输入了所需的详细信息/参数,但我无法了解从哪里获取此签名或如何生成此签名?任何帮助将不胜感激。
答案 0 :(得分:0)
最简单,最快捷的方法是使用AWS SDK之一。您可以在此处找到完整列表:https://aws.amazon.com/tools/
使用SDK时,您只需提供访问密钥和密钥。这些库处理准备签名。
答案 1 :(得分:0)
嗯,一旦有了SDK,就没有必要在Ruby中自己做这件事,但对签名过程的解释可能对某些人有用。
签名是AWS对API请求进行身份验证的方式。它作为HTTP请求的查询字符串参数传递,并根据您自己的请求内容和服务器端的凭据进行验证。
它有2个版本:2和4,解释here和here。新区域(中国和法兰克福)不支持第2版。
在我更熟悉的版本2中,签名是基于具有以下格式的字符串生成的:
HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI
+ "\n" + CanonicalizedQueryString
CanonicalizedQueryString 是您的查询字符串,参数按参数名称排序(UTF-8字节顺序),参数值为url-encoded。
然后使用 AWS密钥和 SHA256 或 SHA1 计算该字符串的 HMAC 作为哈希算法(取决于您在查询字符串参数 SignatureMethod 上指定的那个),并将其编码为base64。所有这些的结果将是签名参数的值。
我将尝试引导您完成使用bash工具手动生成的 CloudWatch 请求。
假设您要列出 CloudWatch 指标。请求(没有签名)将如下所示。
http://monitoring.amazonaws.com/?AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG&Action=ListMetrics&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2015-08-20T22%3A40%3A00.000Z&Version=2010-08-01
所以,你要签名的字符串是:
GET
monitoring.amazonaws.com
/
AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG&Action=ListMetrics&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2015-08-20T22%3A40%3A00.000Z&Version=2010-08-01
好吧,让我们把它放在变量中并做所有的魔术(hmac + base64)
#!/bin/bash
# your secret key
key='ry+SyjvXLvi4lYie/QfZYnxYOBQDggf01DTUxFSK'
# using 'read' to assign the signing string
# to a variable for readability reasons
read -r -d '' payload <<EOF
GET
monitoring.amazonaws.com
/
AWSAccessKeyId=AVUKYAMNIIGWALNMA6IG\
&Action=ListMetrics\
&SignatureMethod=HmacSHA1\
&SignatureVersion=2&\
Timestamp=2015-08-20T22%3A40%3A00.000Z\
&Version=2010-08-01
EOF
echo -n "$payload" | openssl dgst -sha256 -hmac $key -binary | openssl enc -base64
然后,在这之后,你最终会得到这样的东西:
<强> xrIYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM = 强>
这是您的签名,最后,您只需对其进行url编码并将其作为一个查询字符串参数附加到您的请求中。
<强> &安培;签名= xrIYF8wO0C8YOQgcdpq6MoJpBWzXEWxuTBAAoqYoGWM%3D 强>
希望如果您正确地完成了所有操作(将符号字符串放在一起,生成哈希并对其进行编码),您的请求将被接受,如果您有足够的权限,则会被执行。
所以,正如你所看到的,这是不值得自己做的事情。使用SDK。 ;)
答案 2 :(得分:0)
谢谢你们的回复。但我终于找到了我的问题,我的解决方案就在这个宝石中:
https://github.com/jugend/amazon-ecs
这就是我实际上正在寻找的东西,它最终帮助我实现了我想要的目标。将其发布在此处,以便人们可以找到更好的解决方案。