我正在编写一个基本客户端来访问Amazon SimpleDB服务,而我在理解签署请求背后的逻辑时遇到了一些麻烦。
以下是一个示例请求:
https://sdb.amazonaws.com/?Action=PutAttributes
&DomainName=MyDomain
&ItemName=Item123
&Attribute.1.Name=Color&Attribute.1.Value=Blue
&Attribute.2.Name=Size&Attribute.2.Value=Med
&Attribute.3.Name=Price&Attribute.3.Value=0014.99
&Version=2009-04-15
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=<Your AWS Access Key ID>
Following is the string to sign.
要签名的消息:
GET\n
sdb.amazonaws.com\n
/\n
AWSAccessKeyId=<Your AWS Access Key ID>
&Action=PutAttributes
&Attribute.1.Name=Color
&Attribute.1.Value=Blue
&Attribute.2.Name=Size
&Attribute.2.Value=Med
&Attribute.3.Name=Price
&Attribute.3.Value=0014.99
&DomainName=MyDomain
&ItemName=Item123
&SignatureMethod=HmacSHA256
&SignatureVersion=2
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&Version=2009-04-15
以下是已签名的请求。
https://sdb.amazonaws.com/?Action=PutAttributes
&DomainName=MyDomain
&ItemName=Item123
&Attribute.1.Name=Color&Attribute.1.Value=Blue
&Attribute.2.Name=Size&Attribute.2.Value=Med
&Attribute.3.Name=Price&Attribute.3.Value=0014.99
&Version=2009-04-15
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&Signature=<URLEncode(Base64Encode(Signature))>
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=<Your AWS Access Key ID>
我没有得到的是要签名的信息。我为什么不明白?好吧,参数顺序 在请求和要签名的消息之间都发生了变化。在示例中可能出现参数按字母顺序排序。
有没有人玩过SimpleDB,能够告诉我签名信息背后的逻辑,即参数顺序等。这里的文档不是很具体。
答案 0 :(得分:4)
回答我自己的问题。
答案隐藏在文档中。我是对的,我要先对参数进行排序。
答案 1 :(得分:1)
对于稍后阅读此问题的人,以下是文档相关部分的引用。此部分似乎已从SimpleDB文档中消失,但仍存在于SQS文档中。它仍然直接适用于SimpleDB。
一个关键问题是您必须对所有HTTP参数值进行正确的URL编码。
不要对RFC 3986的任何非保留字符进行URL编码 定义
这些未保留的字符是A-Z,a-z,0-9,连字符( - ),下划线(_),句点(。)和波浪号(〜)。
百分比用%XY编码所有其他字符,其中X和Y是十六进制字符0-9和大写字母A-F。
百分比编码扩展的UTF-8字符,格式为%XY%ZA
百分比将空格字符编码为%20(而不是+,正如常见的编码方案那样)。
常见错误包括无法对星号字符(*)进行编码,该字符可以出现在数据值和SelectExpressions中。