我目前正在尝试通过blueimp库设置客户端上传到我的存储桶,并设置this更多最新的设置教程。
我似乎错误地构建了签名,但我这样做是如何超出我的。如果有人愿意借一双新眼睛,那就非常感激了。
确切的回答是“SignatureDoesNotMatch我们计算的请求签名与您提供的签名不符。检查您的密钥和签名方法”
生成签名的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
$('.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)
})
},
})
})
答案 0 :(得分:1)
更重要的是,官方AWS SDK for PHP会为您处理hard stuff。
<?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;
答案 1 :(得分:1)
结果是403的原因是签名没有正确生成。参数的顺序稍微偏离,应该与AWS docs中所述的顺序完全匹配。
POST http://iam.amazonaws.com/ HTTP/1.1
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east- 1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ced6826de92d2bdeed8f846f0bf508e8559e98e4b0199114b84c54174deb456c
host: iam.amazonaws.com
Content-type: application/x-www-form-urlencoded; charset=utf-8
x-amz-date: 20110909T233600Z
Action=ListUsers&Version=2010-05-08