2013-02-09 3 views
1

Я просмотрел большинство образцов кода на основе этой проблемы при переполнении стека, но я все еще не могу получить запрос на работу. Я получаю эту ошибку:Подписанная нами подпись запроса не соответствует AMAZON AWS ​​PHP

<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. 

Вот мой код:

$access_key = "ACCESS_KEY"; 
$associateTag = "AOSSOCIATE_TAG"; 
$secretkey = "SECRET_KEY"; 
$keywords = "harry%20potter"; 
$timestamp = gmdate("Y-m-d\TH:i:s\Z"); 
$operation = "AWSECommerceService"; 

function createSignature($operation,$timestamp,$secretkey){ 
    $the_string=$operation.$timestamp; 
    return base64_encode(hash_hmac("sha256",$the_string,$secretkey,true)); 
} 

$signature = createSignature ($operation,$timestamp,$secretkey); 

$APIcall = 
"http://ecs.amazonaws.com/onca/xml?". 
"AWSAccessKeyId=$access_key&". 
"AssociateTag=$associateTag&". 
"BrowseNode=1000&". 
"ItemPage=1&". 
"Keywords=$keywords&". 
"Operation=ItemSearch&". 
"ResponseGroup=Medium&". 
"SearchIndex=Books&". 
"Service=AWSECommerceService&". 
"Timestamp=$timestamp&". 
"Version=2011-08-01&". 
"Signature=$signature"; 

$response = simplexml_load_file($APIcall); 

Может кто-нибудь помочь?

+0

Почему вы беспокоитесь об этом, когда есть хороший, хорошо поддерживаемый PHP API, доступный прямо из Amazon? http://aws.amazon.com/sdkforphp/ – ceejayoz

+0

Поскольку я чувствовал, что установка SDK была немного превыше всего того, чего я хотел достичь, я в конечном итоге просто хочу показать, возможно, 3 элемента из амазонки в боковой панели на основе ключевого слова и все, просто чувствовал, что делать это сам будет менее громоздким и быстрым. – AJFMEDIA

+1

Установка SDK занимает пару минут. Вы явно потратили, по крайней мере, то, что пытались сделать это самостоятельно, устранение неполадок и размещение здесь. – ceejayoz

ответ

0

Функция выглядит нормально (это то же самое, что и в амазонке AWS SDK), поэтому убедитесь, что перед пробелом нет или перед скопированным ключом.

2

Я имел этот вопрос долгое время, и он работал для меня с этим кодом:

require_once 'Crypt/HMAC.php'; 
require_once 'HTTP/Request.php'; 

$keyId = "adasdasd"; 
$secretKey = "asdasdasdasdasd+"; 

function hex2b64($str) { 
    $raw = ''; 
    for ($i=0; $i < strlen($str); $i+=2) { 
    $raw .= chr(hexdec(substr($str, $i, 2))); 
    } 
    return base64_encode($raw); 
} 

function constructSig($str) { 
    global $secretKey; 
    $str = utf8_encode($str); 
    $secretKey = utf8_encode($secretKey); 
    $hasher =& new Crypt_HMAC($secretKey, "sha1"); 
    $signature = hex2b64($hasher->hash($str));  
    return ($signature); 
} 


$expire = time()+1000; 
$resource = "/demo/files/clouds.jpg"; 
$date = gmdate("D, d M Y G:i:s T"); 
$mime = "image/jpeg"; 

$stringToSign = "PUT\n"; 
$stringToSign .= "\n"; 
$stringToSign .= "$mime\n"; 
$stringToSign .= "$date\n"; 
$stringToSign .= $resource; 
$req =& new HTTP_Request("http://nameofmine.s3.amazonaws.com/files/clouds.jpg"); 
$req->setMethod("PUT"); 
$req->addHeader("Date",$date); 
$req->addHeader("Authorization", "AWS " . $keyId . ":" . constructSig($stringToSign)); 
$req->addHeader("Content-Type",$mime); 
$req->setBody(file_get_contents($file_path)); 
$req->sendRequest(); 
$responseCode = $req->getResponseCode(); 
$responseString = $req->getResponseBody(); 
echo $responseCode; 

Как вы видите, вы должны использовать Crypto, HTTP груш плагинов

0

Когда я напечатал в моих полномочиях вручную , Я получил такую ​​же ошибку пару раз.

Затем я попробовал консоль для Windows, чтобы я мог скопировать/вставить мои учетные данные. Это удалило сообщение об ошибке. Либо я втянулся, набрав, либо втянулся в чтение.

Короткий рассказ: не печатайте вручную, не копируйте и не пропустите учетные данные, чтобы избежать опечаток.

EDIT: Моя проблема заключалась в попытке добавить мои учетные данные через EB CLIx3.

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

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