AWS S3上传访问通过使用AWS-SDK PHP生成的预先签名列表拒绝



我正在尝试使用AWS SDK PHP生成的预先签名的帖子将文件(测试图像(上传到我的S3存储桶中。首先,我生成了预签名的帖子,然后我用邮递员或通过简单的HTML表单手动创建请求...填写所有内容后,请求导致访问被拒绝:-(。与客户端关联以生成PostObjectV4的用户允许在相应的存储桶上进行S3:PutObject策略。

我已经尝试了:

  • 将我的水桶设置为公众写的,它可以工作!这表明我有一个许可/政策问题...不幸的是,我的水桶不必公开...
  • 通过AWS命令行上传文件,它也可以工作

预先签名的后期的PHP代码(数据在$ postObject中(:

$assetAwsS3Key = $this->getAssetAwsS3Key($asset);
$options = [
    ['starts-with', '$key', 'myDir/'],
];
// Optional: configure expiration time string
$expires = '+24 hours';
// Set some defaults for form input fields
$formInputs = ['acl' => 'private'];
$postObject = new PostObjectV4(
    $this->buildAwsS3UserClient(),
    $this->awsBucketName,
    $formInputs,
    $options,
    $expires
);
// Get attributes to set on an HTML form, e.g., action, method, enctype
$formAttributes = $postObject->getFormAttributes();
// Get form input fields. This will include anything set as a form input in
// the constructor, the provided JSON policy, your AWS access key ID, and an
// auth signature.
$formInputs = $postObject->getFormInputs();
return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];

我的用户(用于客户生成(策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::awsBucketName/*"
            ]
        }
    ]
}

我的简单HTML表格用于测试上传:

<form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com" enctype="multipart/form-data">
        <input type="hidden" name="key" value="myKey/sources/myImg.jpg" /><br />
        <input type="file"   name="file" /> <br />
        <input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />
        <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
        <input type="hidden" name="X-Amz-Date" value="20190510T132109Z" />
        <input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
        <input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
        <input type="submit" name="submit"/>
    </form>

您是否有想法/线索,为什么此上传失败,而在存储桶不允许公共写入时?

非常感谢!

我摆脱了问题,我将分享自我第一篇文章以来我在这里所做的更改,以便上传上传。如有必要,请根据您的需求进行调整。

使用的AWS配置: - 相同的在线与第一篇文章一样(请确保您在资源密钥中设置的存储桶名称( -S3存储桶没有任何政策 -S3存储桶所有公共访问禁用

这是我最新的PHP代码,用于创建PostObject:

    $objectKey = $this->objectKeyGenerator->getObjectKey($object);
    $options = [
        ['bucket' => $this->getBucketName()],
        ['eq', '$key', $objectKey],
        ['acl' => 'private']
    ];
    // Optional: configure expiration time string
    $expires = '+2 hours';
    // Set some defaults for form input fields
    $formInputs = [
        'acl' => $acl,
        'key' => $objectKey
    ];
    $postObject = new PostObjectV4(
        $this->getS3Client(),
        $this->getBucketName(),
        $formInputs,
        $options,
        $expires
    );
    // Get attributes to set on an HTML form, e.g., action, method, enctype
    $formAttributes = $postObject->getFormAttributes();
    // Get form input fields. This will include anything set as a form input in
    // the constructor, the provided JSON policy, your AWS access key ID, and an
    // auth signature.
    $formInputs = $postObject->getFormInputs();
    return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];

与我的第一篇文章相比,对象生成的变化是什么:

  • 我不再使用'start-with'选项,而是手动生成对象密钥,以便仅在生成的密钥上上传上传的文件(如果给出另一个密钥,它将失败,因为键non-non--平等(,但我认为这不是导致错误的原因,我很确定它总是可以与"开始"选项一起使用。
  • bucket acl 属性现在在$ options array中,作为PHP开发者的AWS SDK中给出的create opobjectV4示例代码(请参阅[https://https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-post.html](。
  • 在$ forminputs数组中,存在,以便我可以将其重新放回PostObject中(因为提交的密钥必须是计算出的密钥(。我认为这不是强制性的。

我试图通过删除 bucket acl 从$选项阵列中复制错误,这导致了" 403禁止错误",但带有消息说明'根据策略的无效:额外的输入字段:桶'我发现不是很明显...我没有在此错误上进行更多调查。

我还共享我的html表单,该表单自第一篇文章以来有所改变,输入字段订单更改并添加了ACL字段,因为策略要求。

    <form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com/" enctype="multipart/form-data">
    <input type="hidden" name="key" value="object/key.txt" /><br />
    <input type="hidden" name="acl" value="private"/>
    <input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />      
    <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
    <input type="hidden" name="X-Amz-Date" value="20200108T093921Z" />
    <input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
    <input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
    File: 
    <input type="file"   name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit"/>

得出结论,在我的原始帖子中,我没有谈论我的S3桶 public-access 策略配置,我认为问题可能在这里。

希望这会有所帮助,请随时询问必要的详细信息。

相关内容

最新更新