接收"无效的政策文件或请求标题!"

时间:2015-11-02 23:32:52

标签: amazon-s3 fine-uploader amazon-iam

我正在尝试按照文档和源文件中提供的示例将文件上传到S3。不幸的是,我在尝试上传时收到以下错误:

  

[Fine Uploader 5.3.2]无效的政策文件或请求标题!

     

[Fine Uploader 5.3.2]政策签署失败。无效的政策文件   或请求标题!

我在这里发现了一些类似错误的帖子,但这些解决方案对我没有帮助。

这是我的jQuery:

<script>
    $('#fine-uploader').fineUploaderS3({
        request: {
            endpoint: "http://mybucket.s3.amazonaws.com",
            accessKey: "changeme"
        },
        signature: {
        endpoint: "endpoint.php"
        },
        uploadSuccess: {
            endpoint: "success.html"
        },        
        template: 'qq-template'
    });
</script>

(请注意,出于安全考虑,我更改了密钥/存储桶名称。)

我使用你的endpoint-cors.php作为模型,并包含了我在这里修改过的部分:

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

// These assume you have the associated AWS keys stored in
// the associated system environment variables
$clientPrivateKey = $_ENV['changeme'];
// These two keys are only needed if the delete file feature is enabled
// or if you are, for example, confirming the file size in a successEndpoint
// handler via S3's SDK, as we are doing in this example.
$serverPublicKey = $_ENV['AWS_SERVER_PUBLIC_KEY'];
$serverPrivateKey = $_ENV['AWS_SERVER_PRIVATE_KEY'];

// The following variables are used when validating the policy document
// sent by the uploader. 
$expectedBucketName = $_ENV['mybucket'];
// $expectedMaxSize is the value you set the sizeLimit property of the 
// validation option. We assume it is `null` here. If you are performing
// validation, then change this to match the integer value you specified
// otherwise your policy document will be invalid.
// http://docs.fineuploader.com/branch/develop/api/options.html#validation-option
$expectedMaxSize = (isset($_ENV['S3_MAX_FILE_SIZE']) ? $_ENV['S3_MAX_FILE_SIZE'] : null);

我也改变了这个:

// Only needed in cross-origin setups
function handleCorsRequest() {
// If you are relying on CORS, you will need to adjust the allowed domain here.
header('Access-Control-Allow-Origin: http://test.mydomain.com');
}

POST似乎有效:

  

POST http://test.mydomain.com/somepath/endpoint.php 200 OK         318ms

......但是成功结束的地方。

我认为部分问题在于我不确定要为&#34; clientPrivateKey&#34;输入什么。这是我的秘密访问密钥&#34;我用IAM设置了吗?

我当然不清楚我在哪里获得serverPublicKey和serverPrivateKey。我在哪里生成S3上的密钥对?我已经梳理了文档,也许我错过了它。

提前感谢您的协助!

1 个答案:

答案 0 :(得分:0)

首先,您在非CORS环境中使用endpoint-cors.php。根据签名端点的URL,浏览器和端点之间的通信似乎是同源的。切换到endpoint.php示例。

关于密钥的问题,您应该创建两个不同的IAM用户:一个用于客户端操作(严格限制),一个用于服务器端操作(管理员用户)。对于每个用户,您将拥有访问密钥(公共密钥)和密钥(私有密钥)。您始终使用客户端公钥提供Fine Uploader,并使用客户端私钥对服务器端的请求进行签名。要执行其他更受限制的操作(例如删除文件),您应该使用服务器用户密钥。