【问题标题】:CORS. Presigned URL. S3CORS。预签名 URL。 S3
【发布时间】:2022-04-20 22:18:40
【问题描述】:

我已经生成了一个预签名的 S3 POST URL。使用返回参数,然后我将其传递到我的代码中,但我不断收到此错误Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

而在 Postman 上,我可以提交带有一个附件的表单数据。

在 PostMan 上,我手动输入了参数

然后将相同的参数输入到我的代码中。

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    您必须将 CORS 配置 编辑为 public ,例如:

       <?xml version="1.0" encoding="UTF-8"?>
    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>
    

    【讨论】:

    • 没有意义,因为我可以通过 Postman 上传。这是一个 POST 请求。不是 GET
    • 感谢您的提示。 “允许的标题:*”帮助了一点,我正在取得一些进展。令我困惑的是,同样的事情在 PostMan 中也起作用。但不在我的代码上
    • @ngzhongcai fwiw,这适用于邮递员和其他测试工具,因为邮递员不是网站。 CORS 是一种浏览器机制,可防止站点 A 向站点 B(即您的存储桶)发出请求,除非站点 B 通过“预检”同意接受站点 A 的查看者的请求。当您使用一个网站访问另一个网站时,浏览器需要对 CORS 友好的响应,但邮递员不需要/使用/触发此安全机制,因为它实际上旨在保护用户和站点 B 免受站点上潜在的恶意代码的侵害A,postman下没有站点A。
    • 这不适用于 AllowHeader * ,有没有人解决这个问题?
    • 在哪里添加?在 S3 控制台 / yourBucket / Permissions / CORS 配置中并设置 h t t p s : //yourdomain.cloud 在我的情况下 * 还不够...
    【解决方案2】:

    无法评论,所以在这里添加。包含 Harvey 的答案,但以文本形式便于复制。

    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "GET",
                "PUT",
                "POST"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": []
        }
    ]
    

    【讨论】:

    • 谢谢你,超级有用!
    【解决方案3】:

    我也遇到过这个问题。我存储桶上的 COR 配置似乎正确,但我的预签名 URL 遇到了 COR 问题。事实证明,我的 AWS_REGION 未将我的 presigner 设置为存储桶的 aws 区域。将AWS_REGION 设置为正确的区域后,它工作正常。我很恼火 CORS 问题对一个简单的问题如此拖后腿,浪费了我几个小时的时间。

    【讨论】:

    • 你如何找出正确的区域? “S3 不需要区域选择。”他们的区域是“全球”
    【解决方案4】:

    在我的情况下,我通过使用 allowedMethods 和 S3 中的起源来修复它。该菜单位于“权限”选项卡下

    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "GET",
                "PUT",
                "POST"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": []
        }
    ]
    

    【讨论】:

    • 如果是文本而不是其他人无法轻易复制的图像,这将是一个更好的答案。
    【解决方案5】:

    我的问题是由于某种原因 - getSignedUrl 返回了一个这样的网址:

    https://my-bucket.s3.us-west-2.amazonaws.com/bucket-folder/file.jpg

    我已经删除了区域部分 - us-west-2 - 并修复了它??‍♂️

    所以现在是这样

    https://my-bucket.s3.amazonaws.com/bucket-folder/file.jpg

    【讨论】:

      【解决方案6】:

      在我的情况下,我特别需要允许 S3 存储桶的 CORS 配置中的 PUT 方法使用预签名 URL,而不是接受答案中的 GET 方法:

      <?xml version="1.0" encoding="UTF-8"?>
      <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
      <CORSRule>
          <AllowedOrigin>*</AllowedOrigin>
          <AllowedMethod>PUT</AllowedMethod>
          <MaxAgeSeconds>3000</MaxAgeSeconds>
          <AllowedHeader>*</AllowedHeader>
      </CORSRule>
      </CORSConfiguration>
      

      【讨论】:

        【解决方案7】:

        对我来说,这是因为我的存储桶名称中有一个连字符(例如 my-bucket)。签名的 URL 将用下划线替换存储桶名称中的连字符,然后对其进行签名。所以这意味着两件事:

        1. CORS 不起作用,因为 URL 在技术上不正确
        2. 我不能只将下划线改回连字符,因为这样当 AWS 验证签名 URL 时签名就会出错

        我最终不得不将我的存储桶重命名为不带连字符的名称(例如 mybucket),然后使用以下配置正常工作:

        <?xml version="1.0" encoding="UTF-8"?>
        <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
        <CORSRule>
            <AllowedOrigin>*</AllowedOrigin>
            <AllowedMethod>GET</AllowedMethod>
            <AllowedMethod>PUT</AllowedMethod>
            <AllowedMethod>POST</AllowedMethod>
            <AllowedMethod>DELETE</AllowedMethod>
            <MaxAgeSeconds>3000</MaxAgeSeconds>
            <AllowedHeader>*</AllowedHeader>
        </CORSRule>
        </CORSConfiguration>
        

        【讨论】:

          【解决方案8】:

          我的问题是我在“AllowedOrigins”的域末尾有一个斜杠 (/)。删除斜线后,请求就起作用了。

          【讨论】:

            【解决方案9】:

            我们只需要指定所需的 HTTP 方法。我们对预签名 URL 使用 POST 方法,因此从“AllowedMethods”中删除了“GET”和“PUT”方法

            [
                {
                    "AllowedHeaders": [
                        "*"
                    ],
                    "AllowedMethods": [
                        "POST"
                    ],
                    "AllowedOrigins": [
                        "*"
                    ],
                    "ExposeHeaders": []
                }
            ]
            

            【讨论】:

              【解决方案10】:

              即使配置正确,我也会遇到类似的 CORS 错误。

              感谢this answer,我发现我的 Lambda@Edge 预签名使用的区域不适合此存储桶。 (由于某些默认堆栈原因,它位于 us-east-1 上)。

              所以我必须在生成 presignedPost 时明确说明该区域

              参考: https://stackoverflow.com/a/13703595/11832970

              【讨论】:

              • 我花了一整天的时间才把它弄好。 CORS 错误只是令人困惑,我应该专注于 301 状态
              猜你喜欢
              • 2018-12-27
              • 2018-07-10
              • 2022-12-18
              • 2014-09-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多