当前位置: 首页 > 知识库问答 >
问题:

[AWS-S3]尽管CORS配置允许,但CORS阻止了在预签名URL上的帖子

丌官运诚
2023-03-14

我正在尝试在AWS S3上上传一些媒体

我有两个应用程序:

  • 可以通过 AWS 开发工具包直接访问 S3 的后端
  • 需要将某些文件直接上传到 S3 的前端

事情是这样的:

>

  • 前端向后端询问预签名帖子网址

    后端调用S3API以获取URL和一些字段(密钥、策略等)

    前端从后端获取这些URL,并尝试使用适当的表单数据发布请求

    我得到这个错误:

    <代码>https://mydomain.or已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头。

    这是我的CORS配置:

    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "GET",
                "PUT",
                "POST",
                "DELETE"
            ],
            "AllowedOrigins": [
                "https://mydomain.or",
            ]
        }
    ]
    

    这是我的预签名POST的后端代码:

        this.videoService.presignedPost(this.entity).toPromise().then((uploadData) => { //Where I get my URL and fields
    
            this.fileInput.url = uploadData.url;
    
            for (const [key, value] of Object.entries(uploadData.fields)) {
                event.formData.append(key, value)
            }
    
            this.fileInput.upload();
    
         });
    

    这是我的预签名POST的后端代码:

     createPreSignedPost(entityDb) {
            let today = new Date();
            console.log(entityDb)
            return new Promise((resolve, reject) => {
                var params = {
                    Bucket: BUCKET_NAME,
                    Fields: {
                        key: my/key/,
                        success_action_status: '201',
                        signature_expiration: (new Date(today.getTime() + 15 * 60000))
                    }
                };
    
    
         s3.createPresignedPost(params, function (err, data) {
                    if (err) {
                        console.error('Presigning post data encountered an error', err);
                        reject(err)
                    } else {
                        console.log('The post data is', data);
                        resolve({url: data.url, fields: data.fields})
                    }
                });
    

    我尝试的是:

    • 该请求似乎与邮递员一起传递,但存储桶中未显示任何内容
    • 已尝试使用铬不安全(未集成 CORS 检查)的相同方法
    • 已显示 CORS 策略,并尝试使用 curl 查看发生了什么

    CORS配置是正常的,当我检查curl时,即使方法和主机在我的CORS配置中是允许的,我也会被阻止。

    我错过了什么吗?

    编辑

    因此,我检查了被CORS阻止的请求,并在HTTP客户端中使用了完全相同的表单数据、头等。它在客户端上运行正常,但我的应用程序仍然被阻止。

  • 共有2个答案

    严元白
    2023-03-14

    我相信这与以下任何一个有关:

      < li >您的JS设置不正确。 < li >正如在另一个回答中提到的,您的CORS配置不正确。

    我尝试了这个确切的用例(在我的例子中没有CORS ),它工作得非常好。为了测试这个用例,我执行了生成预签名URL的Java V2示例。请参见以下代码示例:

    https://github . com/AWS docs/AWS-doc-SDK-examples/blob/master/javav 2/example _ code/S3/src/main/Java/com/example/S3/generatepresignedurlanduploadobject . Java

    接下来,我获取从此示例生成的 URL,并将其用于从另一个应用发布数据(通常不允许上传)。

    回应是200:

    查看Java示例,并确保在JS代码中设置了所有设置。

    公孙弘深
    2023-03-14

    可能什么都不是,但是在“允许的原创”之后有一个无效的逗号:[“https://mydomain.or”,]。这在控制台中 S3 存储桶的 CORS 字段中被标记为无效 JSON。

     类似资料:
    • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

    • 所以我已经实现了一个Spring引导JAVA应用程序作为服务器和角作为前端。所以实际上,当我在本地运行这些时,一切都很好。 但是当我为两者构建Docker映像并尝试将它们作为容器进行测试时,我面临着CORS错误。 由于我使用JWT令牌作为安全性,我已经禁用了crsf和默认的Spring Security令牌。所以在这里您可以看到CORS的JAVA配置; 这就是nginx。形态 即使我尝试在同一网络

    • 我正试图从vue.js端访问laravel服务器。但它表明 CORS策略阻止从来源“http://localhost:8000/api/registerdoctor”访问位于“http://localhost:8080”的XMLHttpRequest:请求的资源上没有“Access-Control-Allow-Origin”标头。 怎么办?

    • 我正在开发一个特性,使用Angular/预签名url和API Gateway/lambda生成预签名url将文件上传到S3。 我的工作流描述如下: 从模板中获取选定文件 请求我的api(网关/lambda)使用文件名生成预签名的URL。 const body={filename:this.selectedfile.name}const preSignedUrl=await this.http.po

    • 我知道水桶是存在的。当我通过AWS Web GUI导航到此项目并双击它时,它将打开带有URL的对象,并且运行良好: 所以我认为我在使用SDK时肯定做错了什么。

    • 使用curl或postman,我得到403禁止: Lambda函数具有以下权限: S3桶具有以下CORS规则: