2013-05-01 6 views
1

Есть много вопросов о stackoverflow, которые имеют некоторое сходство с этим вопросом, но ничего подобного не так.Amazon AWS простой запрос книги. Как сделать Подпись в Delphi?

У меня есть приложение, которое обрабатывает запросы AWS и отправляет обратно данные XML. Я monitoried его, и он посылает строку, как это:.

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, пожалуйста!

+0

Я считаю, что подпись имеет какое-то отношение к ** параметру Timestamp ** в URL-адресе, поэтому вы можете изучить это. – ComputerSaysNo

+0

Да, здесь все «объяснено»: – user1355041

+0

Да, вы абсолютно правы. Здесь все «объяснено»: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html Однако, когда я его кодирую, я не могу заставить его работать. Мне интересно, может ли кто-то быть таким добрым, чтобы предоставить фрагмент кода. У меня есть Googled повсюду и не могу найти ничего, что работает в Delphi – user1355041

ответ

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; 
+0

Какие библиотеки вы используете? Мой Delphi не может найти T160BitDigest, HTTPEncode, cHash и HTTPApp @ user1355041 –

Смежные вопросы