Php AWS S3签名不起作用

Php AWS S3签名不起作用,php,amazon-web-services,amazon-s3,upload,Php,Amazon Web Services,Amazon S3,Upload,不确定我的代码有什么问题。。php和html在实际页面中是分开的 我从AWS得到的错误是: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 require '/aws/aws-autoloader.php'; use Aws\Common\Aws; use Aws\S3\S3Client; $aws = Aws::factory(array( 'key' => "XXX", 'secret' => "ZZZ" )); $s3 = $aws->ge

不确定我的代码有什么问题。。php和html在实际页面中是分开的

我从AWS得到的错误是:

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

require '/aws/aws-autoloader.php';
use Aws\Common\Aws;
use Aws\S3\S3Client;

$aws = Aws::factory(array(
    'key' => "XXX", 'secret' => "ZZZ"
));


$s3 = $aws->get("s3");
$policy = base64_encode('{
    "expiration": "2016-08-06T12:00:00.000Z",
    "conditions": [
        {"bucket": "richqtest" },
        ["starts-with", "$key", "user/rdqrdq/${filename}"],
        {"acl": "public-read" },
        {"redirect": "http://cnn.com" },
        ["starts-with", "$Content-Type", "image/"],
        {"x-amz-meta-uuid": "14365123651274"},
        ["starts-with", "$x-amz-meta-tag", ""],

        {"x-amz-credential": "XXX/20160806/us-west-2/s3/aws4_request"},
        {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
        {"x-amz-date": "20160806T000000Z" }
    ]
}');

$secret = "ZZZ";

$signature = base64_encode(hash_hmac('sha256', $policy, $secret, true));



<form action="http://richqtest.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
Key to upload: 
<input type="input"  name="key" value="user/rdqrdq/${filename}" /><br />
<input type="hidden" name="acl" value="public-read" />
<input type="hidden" name="success_action_redirect" value="http://cnn.com" />
Content-Type: 
<input type="input"  name="Content-Type" value="image/jpeg" /><br />
<input type="hidden" name="x-amz-meta-uuid" value="14365123651274" />
<input type="text"   name="X-Amz-Credential" value="XXX/20160806/us-west-2/s3/aws4_request" />
<input type="text"   name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="text"   name="X-Amz-Date" value="20160806T000000Z" />

Tags for File: 
<input type="input"  name="x-amz-meta-tag" value="" /><br />
<input type="hidden" name="Policy" value="<?php echo $policy ?>" />
<input type="hidden" name="X-Amz-Signature" value="<?php echo $signature ?>" />
File: 
<input type="file"   name="file" /> <br />
<!-- The elements after this will be ignored -->
<input type="submit" name="submit" value="Upload to Amazon S3" />
require'/aws/aws autoloader.php';
使用Aws\Common\Aws;
使用Aws\S3\S3客户端;
$aws=aws::工厂(阵列(
'key'=>XXX','secret'=>ZZZ'
));
$s3=$aws->get(“s3”);
$policy=base64_编码('{
“到期日”:“2016-08-06T12:00:00.000Z”,
“条件”:[
{“bucket”:“richqtest”},
[“以“,“$key”,“user/rdqrdq/${filename}”开头],
{“acl”:“公共读取”},
{“重定向”:http://cnn.com" },
[“以“,“$Content-Type”,“image/”开头],
{“x-amz-meta-uuid”:“14365123651274”},
[“以”、“$x-amz-meta-tag”、”“”开头],
{“x-amz-credential”:“XXX/20160806/us-west-2/s3/aws4_请求”},
{“x-amz-algorithm”:“AWS4-HMAC-SHA256”},
{“x-amz-date”:“20160806T000000Z”}
]
}');
$secret=“ZZZ”;
$signature=base64_编码(hash_hmac('sha256',$policy,$secret,true));
要上载的密钥:

内容类型:
文件的标记:

这看起来是个好办法。。但我想我很快就会知道的。
$secret=“ZZZ”。。。那代表你的秘密吗?这不是版本4中这一步使用的。是的,ZZZ代表我的aws秘密访问密钥。。上面的文档说要在2中添加它。当计算签名时,签名密钥部分,尽管我仍然得到相同的错误。就我所知,一切看起来都是对的:(((我能想到的唯一一件事是在PHP中连接字符串来构造策略,而不是使用一个长字符串。可能会被空格绊倒?如果您修改了代码,请编辑问题。正确实现后,您将对sha256进行5次不同的调用。我实际上找到了一个名为Amaze的好s3包装器在S3 PHP类上。它有一个名为_getHash的函数,可以满足我的需要。下面是指向github的链接: