Мой тестовый запрос для API Amazon Web Service возвращается со следующей ошибкой:
<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>ebe90459-1abd-403e-bfec-6916ebe07e1f</RequestId>
</ItemSearchErrorResponse>
Вот как я пришел к этому:
<?php
$private_key = "XXXXXXXXXXXXXXXXXXXXXX";
$date = urlencode(date('Y-m-d\TH:i:s.Z\Z', time()));
$string_to_sign = "GET webservices.amazon.com /onca/xml/ AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXXXXXA&Keywords=Rocket&Operation=ItemSearch&SearchIndex=Toys&Service=AWSECommerceService&Timestamp=".$date."";
$signature = urlencode(base64_encode(hash_hmac("sha256",$string_to_sign, $private_key, True)));
$url = "http://webservices.amazon.com/onca/xml?AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXXXXXX&Keywords=Rocket&Operation=ItemSearch&SearchIndex=Toys&Service=AWSECommerceService&Timestamp=".$date."&Signature=".$signature."";
header("Location: ".$url."");
?>
Я в основном хотел подписать REST-запрос непосредственно в URL (отсюда функция заголовка), но оставил меня в тупике с ошибкой. Я дважды проверил свой идентификатор доступа и секретный ключ, так что я знаю, что они не являются причиной проблемы. Разве это не правильный способ произвести подпись?
Кажется, вы пытаетесь использовать сигнатуру V2 для вызова REST API AWS.
Пожалуйста, обратитесь к полному Документация по вызовам API AWS REST.
Моя ставка в том, что проблема заключается в отсутствии SignatureVersion
, SignatureMethod
а также Version
в строке перед подписанием. Шаг пятый из документации, указанной выше, показывает пример строки для подписи:
GET\n
elasticmapreduce.amazonaws.com\n
/\n
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
Других решений пока нет …