【问题标题】:How can I delete images in Amazon AWS with cURL without using the SDK如何在不使用 SDK 的情况下使用 cURL 删除 Amazon AWS 中的图像
【发布时间】:2018-10-04 04:43:33
【问题描述】:

这是我迄今为止尝试过的:

$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。

【问题讨论】:

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


    【解决方案1】:

    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
    

    请注意,您可能需要在您的签名中进行一些 url-escaped 替换:

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

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

    【讨论】:

      【解决方案2】:
      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>";
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        相关资源
        最近更新 更多