亚马逊AWS简单书籍查询。你如何在Delphi中签名?

时间:2013-05-01 01:24:49

标签: delphi amazon-web-services amazon signature

堆栈溢出有很多问题与这个问题有一些相似之处,但没有什么比这更像。

我有一个应用程序可以查询AWS并发回XML数据。我已经监控了它,并发送了一个像这样的字符串:

http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=wwwratterriec-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2013-04-30T22%3A00%3A00.000Z&Version=2011-08-01&Signature=n1x%2BtbR71WFAgPHYq4rrpamgMb4%3D

如果您尝试一下,您将获得一些XML,告诉您“请求已过期。时间戳日期为2013-04-30T22:00:00.000Z”等。

如果“ToBeSigned”不匹配,您会收到消息“我们计算的请求签名与您提供的签名不符。”

我的问题是我无法获得生成正确“签名”的“ToBeSigned”版本。我发现文档令人困惑 - 也许是因为它适用于Java或PHP。

上述链接中的“ToBeSigned”是什么? 请在Delphi伪代码中

1 个答案:

答案 0 :(得分:2)

以下是适用于我的Delphi代码。只需更改参数值以适合您的目的,并输入您自己的密钥。我把TimeStamp放在了现在加上2.4小时 - 改变它以适合你自己的目的。

procedure TForm1.ButtonWorksClick(Sender: TObject);
var
  toHash, SecretAccessKey, dirstr, awssignature, sg, ts, link: String;
  sig: T160BitDigest;
  SystemTime1: SYSTEMTIME;
  dt1: TDateTime;
begin
  GetSystemTime(SystemTime1);
  dt1 := SystemTimeToDateTime(SystemTime1) + 0.1;
  ts := '&Timestamp=' + HTTPEncode(FormatDateTime('yyyy"-"mm"-"dd"T"hh":00:00.000Z', dt1));

  tohash := 'GET' + Chr(10) + 'ecs.amazonaws.com' + Chr(10) + '/onca/xml' + Chr(10) +
    'AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=locboo01-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books' +
    '&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2' + ts + '&Version=2011-08-01';

  SecretAccessKey := 'Your secret key here';

  Sig := cHash.CalcHMAC_SHA1(SecretAccessKey, tohash);
  dirstr := cHash.SHA1DigestAsString(Sig);
  awssignature := EncdDecd.EncodeString(dirstr);

  sg := HTTPApp.HTTPEncode(awssignature);
  link := 'http://ecs.amazonaws.com/onca/xml' + '?' +
    'AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=locboo01-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books' +
    '&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2' + ts + '&Version=2011-08-01' + '&Signature=' + sg;
  Clipboard.AsText := link;

  Memo1.Lines.Add(sg);
end;