1

私のコードは数日前に問題なく動作していました。その後、突然、BAM: 動作しなくなりました。SignatureDoesNotMatch エラーが発生して、PUT が停止しました。ヘルプ?

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


function uploadFile($path_to_file, $store_file_as, $bucket, $debugmode = false) {

        $S3_URL = "http://s3.amazonaws.com/";
        $filePath = $path_to_file;
        $contentType = 'audio/mpeg';
        $keyId = 'THISISMYKEY, YES I DOUBLE CHECKED IT';
        $secretKey = 'THIS IS MYSECRET, YES I DOUBLED CHECKED IT';
        $key = $store_file_as;
        $resource = $bucket . "/" . $key;
        $acl = "public-read";
        $verb = "PUT";
    $httpDate = gmdate("D, d M Y H:i:s T");
    $stringToSign = "PUT\n\naudio/mpeg\n$httpDate\nx-amz-acl:$acl\n/$resource";
    $hasher =& new Crypt_HMAC($secretKey, "sha1");
    $str =  $hasher->hash($stringToSign);
    $raw = '';
    for ($i=0; $i < strlen($str); $i+=2) {
        $raw .= chr(hexdec(substr($str, $i, 2)));
    }
    $signature = base64_encode($raw);

    $req =& new HTTP_Request($S3_URL . $resource);
    $req->setMethod('PUT');
    $req->addHeader("content-type", $contentType);
    $req->addHeader("Date", $httpDate);
    $req->addHeader("x-amz-acl", $acl);
    $req->addHeader("Authorization", "AWS " . $keyId . ":" . $signature);
    $req->setBody(file_get_contents($filePath));  
    $req->sendRequest();
   echo $req->getResponseBody();
   }
4

1 に答える 1

4

Amazon S3 JavaScript 署名テスターに​​対して署名を実行します。

2 つの署名が一致しない場合は、キーまたは署名手順に何か問題があることがわかります。

2 つが一致する場合、キーと署名プロセスは正しく、問題は別の場所にあります。

JS テスターは、署名生成の問題のトラブルシューティングに非常に役立ちます。

于 2009-09-02T03:35:46.980 に答える