1

スタック オーバーフローに関するこの問題に基づいたほとんどのコード サンプルを見てきましたが、まだリクエストを機能させることができません。このエラーが発生し続けます:

<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);

誰でも助けることができますか?

4

3 に答える 3

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 pear プラグインを使用する必要があります

于 2013-02-18T03:02:05.147 に答える
0

関数は問題ないようです(Amazon AWS SDKで使用されているものと同じです)。コピーされたキーの前後に空白がないことを確認してください。

于 2013-02-13T20:13:14.840 に答える
0

資格情報を手で入力すると、同じエラーが数回発生しました。

次に、資格情報をコピーして貼り付けることができるように、Console for Windows を試しました。これにより、エラー メッセージが削除されました。タイピングが苦手だったか、読むのが苦手でした。

手短に言えば、タイプミスを避けるために、資格情報を手で入力したり、コピーして貼り付けたりしないでください。

編集:私の問題は、EB CLIx3 経由で資格情報を追加しようとしたときでした。

于 2015-02-23T20:56:10.497 に答える