Jquery 尝试客户端post时禁止使用AWS 403

Jquery 尝试客户端post时禁止使用AWS 403,jquery,upload,amazon-web-services,amazon-s3,Jquery,Upload,Amazon Web Services,Amazon S3,我目前正在尝试通过库和更多最新的安装教程设置客户端上传到我的bucket 我似乎构造的签名不正确,但我是如何做到这一点是超越我。如果有人愿意伸出一双崭新的眼睛,我们将不胜感激 准确的回答是“SignatureDesNotMatch我们计算的签名与您提供的签名不匹配。请检查您的密钥和签名方法” 生成签名的PHP API $policy = base64_encode( preg_replace("/\n|\r/", "", json_encode(

我目前正在尝试通过库和更多最新的安装教程设置客户端上传到我的bucket

我似乎构造的签名不正确,但我是如何做到这一点是超越我。如果有人愿意伸出一双崭新的眼睛,我们将不胜感激

准确的回答是“SignatureDesNotMatch我们计算的签名与您提供的签名不匹配。请检查您的密钥和签名方法”

生成签名的PHP API

        $policy = base64_encode(
     preg_replace("/\n|\r/", "",
        json_encode(

                array(
                    "expiration" => $expires,
                    "bucket" => $S3_BUCKET, 
                    "acl" => "public-read",
                    "starts-with" => $object_name,
                    "success_action_status" => "201"
                )
            )
        ) 
    );

    //$policy = preg_replace("/\n|\r/", "", $policy);

    $signature = base64_encode(
            hash_hmac(
                'sha1', 
                $config->aws_secret,
                $policy
            )

    );

    $signature = preg_replace("/\n/", "", $signature);

    $awsAccessInfo = array(
        "signature" => $signature, 
        "aws_key" => $AWS_ACCESS_KEY, 
        "policy" => $policy, 
        "bucket" => $S3_BUCKET,
            "key" => $AWS_ACCESS_KEY
    );

    return $this->getResponse()->json($awsAccessInfo);
JS


更重要的是,官员会为你处理这些问题


最后得出结论,403的原因是没有正确生成签名。论点的顺序有点不一致,应该与文章中陈述的顺序完全一致

POSThttp://iam.amazonaws.com/ HTTP/1.1
授权:AWS4-HMAC-SHA256 Credential=AkideSample/20110909/us east-1/iam/AWS4_请求,SignedHeaders=内容类型;主办x-amz-date,签名=ced6826de92d2bdeed8f846f0bf508e8559e98e4b0199114b84c54174deb456c
主持人:iam.amazonaws.com
内容类型:application/x-www-form-urlencoded;字符集=utf-8
x-amz-日期:20110909T233600Z
操作=列表用户&版本=2010-05-08

我想知道这是否是我的问题(并因此清理了我的策略!),但对我来说,这是一个缺少的bucket策略,回答如下:
$('.direct-upload').each(function() {

    var form = $(this);
    $(this).fileupload({
      url: form.attr('action'),
      type: 'POST',
      autoUpload: true,
      dataType: 'xml', // This is really important as s3 gives us back the url of the file in a XML document
      add: function (event, data) {
                console.log(data.files[0].name);
        $.ajax({
          url: "http://api/sign_request_s3?allowOrigin=1",
          type: 'GET',
          dataType: 'json',
          data: { s3_object_name: data.files[0].name}, // send the file name to the server so it can generate the key param
          async: false,
          success: function(data) {

            // Now that we have our data, we update the form so it contains all
            // the needed data to sign the request
                        console.log("Key: " + data.aws_key + " Signature: " + data.signature);
            form.find('input[name=key]').val(data.aws_key);
                        form.find('input[name=AWSAccessKeyId]').val(data.aws_key);
            form.find('input[name=policy]').val(data.policy);
            form.find('input[name=signature]').val(data.signature);
          }
        });
        data.submit();
      },
      send: function(e, data) {
        $('.progress').fadeIn();
                console.log("sending...");
      },
      progress: function(e, data){
        // This is what makes everything really cool, thanks to that callback
        // you can now update the progress bar based on the upload progress
        var percent = Math.round((e.loaded / e.total) * 100)
        $('.bar').css('width', percent + '%')
      },
      fail: function(e, data) {
        console.log('failed');

      },
      success: function(data) {
        // Here we get the file url on s3 in an xml doc
        var url = $(data).find('Location').text()
                console.log('success');
        $('#real_file_url').val(url) // Update the real input in the other form
      },
      done: function (event, data) {
        $('.progress').fadeOut(300, function() {
          $('.bar').css('width', 0)
        })
      },
    })
  })
<?php
error_reporting(-1);
header('Content-type: text/html; charset=utf-8');
require_once __DIR__ . '/vendor/autoload.php';
#---------------------------------------------

define('INDENT', '    ');

// Import namespaces
use Aws\S3\S3Client;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Model\PostObject;

// Instantiate S3 client
$s3 = S3Client::factory(array(
    'key'    => '...',
    'secret' => '...',
));

// Instantiate and prepare PostObject
$post = new PostObject($s3, 'my-test-bucket', array(
    'acl' => CannedAcl::PUBLIC_READ,
));
$post->prepareData();

// Get the attributes for the <form> tag
$attributes = array();
foreach ($post->getFormAttributes() as $attr => $value)
{
    $attributes[] = "${attr}=\"${value}\"";
}
$attributes = implode(' ', $attributes);

// Write some HTML via PHP. This is for learning. Never do this in real life.
echo "<form ${attributes}>" . PHP_EOL;
foreach ($post->getFormInputs() as $name => $value)
{
    // Write hidden fields
    echo INDENT . "<input type=\"hidden\" name=\"${name}\" value=\"${value}\">" . PHP_EOL;
}

// Upload and submit
echo INDENT . "<input type=\"file\" name=\"file\">" . PHP_EOL;
echo INDENT . "<input type=\"submit\" name=\"upload\" value=\"Upload\">" . PHP_EOL;

echo "</form>" . PHP_EOL;