2016-09-08 3 views
0

Итак, я пытаюсь обратиться к API-интерфейсу Amazon, но не могу понять, как заставить подпись работать. Я следовал за другим переполнением стека, который можно найти здесь: How can I create a signature for AWS in Javascript?, но по-прежнему не может выполнить мой запрос. Вот запрос, который я отправляю (в настоящее время тестируется через почтальон).Выполнение запросов к веб-сервисам Amazon API REST, не может получить запрос Подпись к работе

http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[MY_ACCESSKEY]&Operation=ItemSearch&Keywords=the%20hunger%20games&SearchIndex=Books &Timestamp=2016-09-09T12:00:00Z&Signature=9RTSas234dfRTs3R%ErA8%

Я сделал фальшивый подпись, подобную той, что я получаю от этой функции:

let service = "AWSECommerceService"; 
let timestamp = "2016-09-09T12:00:00Z"; 
let operation = "ItemSearch"; 
let secret = "MY_AMAZONSECRET"; 
let signature = CryptoJS.HmacSHA1(service + operation + timestamp, secret).toString(CryptoJS.enc.Base64); 
console.log(signature); 

Результат, который входит в консоль выглядит следующим образом: 9RTSas234dfRTs3R+ErA8=

От что я читал здесь http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html, я думал, что вам нужно заменить знаки «+» и «=» на «%». Когда я оставляю знаки + и = как есть, я получаю следующий ответ от AWS:

<?xml version="1.0"?> 
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/"> 
    <Error> 
     <Code>SignatureDoesNotMatch</Code> 
     <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> 
    </Error> 
    <RequestId>{MY_REQUESTID}</RequestId> 
</ItemSearchErrorResponse> 

Но когда я их меняю в% 's, я получаю такой ответ:

<?xml version="1.0"?> 
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/"> 
    <Error> 
     <Code>MissingParameter</Code> 
     <Message>The request must contain the parameter Signature.</Message> 
    </Error> 
    <RequestId>{MY_REQUESTID}</RequestId> 
</ItemSearchErrorResponse> 

Несмотря на то, параметр Signature существует в запросе. Любые мысли о том, как я могу это исправить. Я использую крипто-JS для создания подписи, который можно найти здесь: https://www.npmjs.com/package/crypto-js

+0

Не считайте ответ MTurk, который вы нашли - это, по-видимому, совершенно другой алгоритм подписи, который здесь не имеет отношения. Прочтите [страницу, с которой вы связались] (http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html) снова. Выполните эти шаги точно. Ваш код не выполняет то, что описано здесь. –

ответ

0

Я думал, что вам нужно, чтобы заменить «+» и «=» на знаки «%».

Да, но вы не просто заменяете их %. С помощью этой карты:

+ becomes %2B 
/becomes %2F 
= becomes %3D 

Это упоминается как URL-кодирования, URL-экранирования, или процент кодирования. Символы заменяются буквами %, за которыми следует их двухзначный шестнадцатеричный эквивалент ASCII.

9RTSas234dfRTs3R+ErA8= becomes 
9RTSas234dfRTs3R%2BErA8%3D 
+0

Я пробовал это, и он все еще говорит мне, что подпись не соответствует. Может ли это быть способ создания даты? Потому что все, что я делаю, вводит его вручную для такой функции: '2016-09-10T12: 00: 00Z' Должен ли я использовать что-то еще для создания даты? – hermt2

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

  • Нет связанных вопросов^_^