如何在不使用SDK的情况下使用cURL删除Amazon AWS中的图像

时间:2018-04-24 03:15:33

标签: php amazon-web-services curl amazon-s3

这是我到目前为止所尝试的:

$t=time()+60;
$to_sign = "DELETE\n\n\n$t\n/myimage.jpg";
$signature = base64_encode( hash_hmac('sha1', utf8_encode( $to_sign ) , $auth['secretKey'], true) ); 

$url = "https://mybucket.s3-us-west-1.amazonaws.com/myimage.jpg?AWSAccessKeyId=MYKEYNUMBERXXX&Signature=$signature&Expires=$t";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'DELETE');
$result = curl_exec($ch);

返回错误:SignatureDoesNotMatch

我正在尝试实现一个简单的功能来删除AWS中的图像,而无需加载整个SDK。

2 个答案:

答案 0 :(得分:0)

Signature Version 2 Query String authentication中的规范化资源是/${bucket}/${key}

$to_sign = "DELETE\n\n\n$t\n/myimage.jpg"; # incorrect
$to_sign = "DELETE\n\n\n$t\n/mybucket/myimage.jpg"; # correct

另请注意,可能需要在签名中进行一些网址转义:

+ becomes %2B
/ becomes %2F
= becomes %3D

另请注意,由于您使用的是Signature V2,因此此代码仅适用于2014年Signature V4成为标准版之前部署S3的区域。

答案 1 :(得分:0)

deleteAWS4( "myBucket", "myimage.jpg");

function deleteAWS4( $bucket, $fileName ){ 
$auth['AccessKeyId'] = "XXXXXXXXXXXXXXXXXXXX";
$auth['secretKey'] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";     
$region = "us-west-1"; 
$date = gmdate("D, d M Y H:i:s")." +0000";
    
$params = array();
$params['AWSAccessKeyId']   =   $auth['AccessKeyId'];
$params['SignatureMethod']  =   'hmac-sha1';  
$params['SignatureVersion'] =   '2';
$params['Timestamp']        =   $date;

uksort($params, 'strcmp'); $params_str = '';
foreach ($params as $key => $val){ 
  $params_str .= rawurlencode($key).'='.rawurlencode($val).'&'; 
}
$params_str = str_replace('%7E', '~',$params_str);  $params_str = substr($params_str, 0, -1);

$t=time()+60;
$to_sign = "DELETE\n\n\n$t\n/$fileName";
$signature = base64_encode( hash_hmac('sha1', utf8_encode( $to_sign ) , $auth['secretKey'], true) ); 
$url = "https://$bucket.s3-us-west-1.amazonaws.com/$fileName?AWSAccessKeyId={$params['AWSAccessKeyId']}&Signature=$signature&Expires=$t";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_HTTPHEADER, false);
//curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $to_sign);
//curl_setopt($ch, CURLINFO_HEADER_OUT, true);

// get the result 
$result = curl_exec($ch); // raw result
$info = curl_getinfo($ch);
// turn the xml response into an array
$result = json_decode(json_encode(simplexml_load_string($result)),true);

echo $url.'<br>';
echo "<pre>"; print_r($result); echo "</pre>";
echo "<pre>";  print_r($info['request_header']); echo "</pre>";
}