2011-12-02 146 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; 
}