gpt4 book ai didi

php - 通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

转载 作者:行者123 更新时间:2023-12-04 12:40:47 28 4
gpt4 key购买 nike

我正在尝试使用 AWS SDK PHP 生成的预签名帖子将文件(用于我的测试的图像)上传到我的 s3 存储桶。
首先,我生成预先签名的帖子,然后我使用 Postman 或通过简单的 html 表单手动创建具有给定 PostObjectV4 数据的请求...
填写完所有内容后,请求结果为 Access Denied :-(。
与客户端关联以生成 PostObjectV4 的用户在相应的存储桶上具有 Allowed 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 存储桶所有公共(public)访问已禁用

    这是我用于创建 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 生成有哪些变化:
  • 我不再使用 'starts-with' 选项并手动生成对象 key ,以便上传的文件必须仅在生成的 key 处上传(如果给出另一个 key ,它将因 key 不相等而失败),但我认为这不是导致错误的原因,我很确定它始终可以与“开始”选项一起使用。
  • acl 属性现在位于 $options 数组中,作为 AWS SDK for PHP Developer Guide 中给出的 Create PostObjectV4 示例代码(请参阅 [ https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-post.html] )。
  • 在 $formInputs 数组中, key 存在,以便我可以在 postObject 中取回它(因为提交的 key 必须是计算出来的)。我认为这不是强制性的。

  • 我试图通过删除 来重现该错误桶 acl 来自 $option 数组,这导致了“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)访问政策 配置,我认为问题可能出在这里。

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

    关于php - 通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080480/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com