2

我正在编写一个基本客户端来访问 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 能够告诉我要签名的消息背后的逻辑是什么,即参数顺序等。这里的文档不是很具体。

4

2 回答 2

4

回答我自己的问题。

答案隐藏在文档中。我是对的,我要先对参数进行排序。

http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/index.html?Query_QueryAuth.html

于 2010-11-29T03:01:29.903 回答
1

对于那些稍后阅读此问题的人,以下是文档中相关部分的引用。此部分似乎已从 SimpleDB 文档中消失,但仍存在于 SQS 文档中。它仍然直接适用于 SimpleDB。

一个关键问题是您必须正确地对所有 HTTP 参数值进行 URL 编码。

  • 不要对 RFC 3986
    定义的任何非保留字符进行 URL 编码。

  • 这些非保留字符是 AZ、az、0-9、连字符 (-)、下划线 (_)、句点 (.) 和波浪号 (~)。

  • 百分比使用 %XY 对所有其他字符进行编码,其中 X 和 Y 是十六进制字符 0-9 和大写 AF。

  • 以 %XY%ZA 形式对扩展的 UTF-8 字符进行百分比编码

  • 百分比将空格字符编码为 %20(而不是 +,就像常见的编码方案那样)。

一个常见错误涉及未能对可能出现在数据值和 SelectExpressions 中的星号字符 (*) 进行编码。

于 2010-11-29T16:03:36.363 回答