2011-12-02 142 views
0

我嘗試了文件上傳到我的Amazon S3闖民宅本教程 http://www.anyexample.com/programming/php/uploading_files_to_amazon_s3_with_rest_api.xmlPHP亞馬遜文件上傳簽名

但我得到了以下錯誤

HTTP/1.1 403 Forbidden 
x-amz-request-id: 10F111F91A85CFC5 
x-amz-id-2: 6pBJs+OKZOZdTF3zQw0MLM62zGAAsCFyeJsv/xzYB+wM7+7RnZU+k1rtcpTWC8VS 
Content-Type: application/xml 
Transfer-Encoding: chunked 
Date: Fri, 02 Dec 2011 09:35:21 GMT 
Server: AmazonS3 

2bf 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>SignatureDoesNotMatch</Code> 
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> 
<StringToSignBytes>50 55 54 0a 0a 0a 46 72 69 2c 20 30 32 20 44 65 63 20 32 30 31 31 20 30 39 3a 33 37 3a 35 30 20 2b 30 30 30 30 0a 2f 74 61 6e 65 77</StringToSignBytes> 
<RequestId>10F111F91A85CFC5</RequestId> 
<HostId>6pBJs+OKZOZdTF3zQw0MLM62zGAAsCFyeJsv/xzYB+wM7+7RnZU+k1rtcpTWC8VS</HostId> 
<SignatureProvided>6V2sLdHEJ9uWZO0G81q5QQzSa9Y=</SignatureProvided><StringToSign>PUT 

任何想法 預先感謝

+2

是'我們出的要求籤名不匹配您提供的簽名。檢查你的密鑰和簽名方法.'不清楚了嗎? –

+0

他們以下是簽名方法...你能幫忙嗎? $ dt = gmdate('r'); //基於GMT的時間戳 //準備要簽名的字符串(請參閱AWS S3開發人員指南) $ string2sign =「PUT {$ dt}/{$ aws_bucket}」; //準備HTTP PUT查詢 $查詢=「PUT/{$ aws_bucket} HTTP/1.1 主持人:s3.amazonaws.com 連接:保持活躍 日期:$ DT 授權:AWS {$ aws_key}: 」 .amazon_hmac(string2sign $) 「\ n \ n」; $ RESP = sendREST($ FP,$查詢); 如果(strpos($ RESP, '')==假的!){ 模具($ RESP); } – ramesh

+1

你有你自己的AWS訪問密鑰ID和祕密訪問鍵? –

回答

2

無有你的代碼,查看它的努力幫助,但這裏是一些示例代碼,您可能會發現有用:

class myS3Helper{ 
public function getSignedImageLink($timeout = 1800, $my_aws_secretkey, $my_aws_key) 
{ 

    $now = new Zend_Date(); //Gives us a time object that is set to NOW 
    $now->setTimezone('UTC'); //Set to UTC a-la AWS requirements 
    $now->addSecond($timeout); //set the time in the time object to a point in the future 
    $expirationTime = $now->getTimestamp(); //returns unix timestamp representation of the time. 

    $signature = urlencode(
      base64_encode(
        hash_hmac(
          'sha1', $this->_generateStringToSign($expirationTime), 
          $my_aws_secretkey, 
          true 
          ) 
        ) 
      ); 

    //Yes - this is ugly but hopefully readable 
    $url = 'https://'; 
    $url .= Zend_Service_Amazon_S3::S3_ENDPOINT; //e.g s3.amazonaws.com 
    $url .= $this->_getImagePath(); //e.g /mybucket/myFirstCar.jpg 
    $url .='?AWSAccessKeyId=' . $my_aws_key; 
    $url .='&Signature=' . $signature; //signature as returned by below function 
    $url .='&Expires=' . $expirationTime; 

    return $url; 


} 

protected function _generateStringToSign($expires) 
{ 

    $string = "GET\n"; //Methods 
    $string .= "\n"; 
    $string .= "\n"; 
    $string .= "$expires\n"; //Expires 
    $string .= $this->_getImagePath(); 

    return $string; 
}