[英]AWS S3 Upload to Frankfurt region using PHP SDK - Access denied error
[英]AWS S3 Upload Access Denied through Presigned post generated with AWS-SDK PHP
我正在尝试使用 AWS SDK PHP 生成的预签名帖子将文件(用于我的测试的图像)上传到我的 s3 存储桶。 首先,我生成预签名的帖子,然后我使用 Postman 或通过简单的 html 表单手动创建具有给定 PostObjectV4 数据的请求......填写完所有内容后,请求结果拒绝访问:-(。与客户端关联的用户在相应的存储桶上生成 PostObjectV4 已 Allowed s3:PutObject 策略。
我已经尝试过:
预签名后生成的 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存储在所有公共访问已禁用
这是我用于创建 postObject 的最新 php 代码:
$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];
与我的第一篇文章相比,postObject 生成有哪些变化:
我试图通过从 $option 数组中删除存储桶和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 存储桶公共访问和策略配置,我认为问题可能出在这里。
希望这会有所帮助,如有需要,请随时询问详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.