Cors 为什么这个对Google Storage的飞行前PUT请求返回403?

Cors 为什么这个对Google Storage的飞行前PUT请求返回403?,cors,google-cloud-storage,Cors,Google Cloud Storage,我正试图建立一个用户上传系统,直接进入谷歌存储,而不是让内容通过我们的服务器。为此,我们让前端首先与服务器联系,获取一个签名的url,然后在收到该url后发送文件。这一切似乎都在起作用。在返回URL后,前端会向Google存储发送一个PUT请求 由于CORS,发送初始选项有效负载并获得200响应。然而,下面的(示例)上传得到一个403,其中包含以下消息,我不明白为什么: 访问位于的XMLHttpRequest '' 来自源“”已被CORS策略阻止: 请求的服务器上不存在“Access Contr

我正试图建立一个用户上传系统,直接进入谷歌存储,而不是让内容通过我们的服务器。为此,我们让前端首先与服务器联系,获取一个签名的url,然后在收到该url后发送文件。这一切似乎都在起作用。在返回URL后,前端会向Google存储发送一个PUT请求

由于CORS,发送初始选项有效负载并获得200响应。然而,下面的(示例)上传得到一个403,其中包含以下消息,我不明白为什么:

访问位于的XMLHttpRequest '' 来自源“”已被CORS策略阻止: 请求的服务器上不存在“Access Control Allow Origin”标头 资源

铲斗的配置如下:

[
{"maxAgeSeconds": 30, "method": ["GET", "PUT"], "origin": ["https://www.spaceofmotion.com"], "responseHeader": ["\*"]},
{"maxAgeSeconds": 30, "method": ["GET", "PUT"], "origin": ["http://localhost:3000"], "responseHeader": ["\*"]}
]
以下是初始选项[pre-]请求:

这是第二个要求:


此设置有什么问题?

请尝试在官方网站上咨询并验证解决CORS问题的要点


从您的屏幕截图可以看到您的第一个请求的状态为200,因此该请求没有问题,您可以实际验证故障排除文档中的所有要点,但对于第二个请求,缺少CORS实现所需的标题(“访问控制请求标题”),故障排除文档第4点提到的“访问控制请求方法”标题缺失)我正在使用nodejs,以及
“@google cloud/storage”:“^3.0.2”

我试过了,但不知道为什么。对于我的情况,只需将客户端库的
版本从
v2
(默认)更改为
v4

const getSignedUrlResponse:getSignedUrlResponse=wait file.getSignedUrl({
动作:“写”,
过期日期:Date.now()+60*1000,
版本:'v4'//v2->v4
});
然后,403 cors错误消失了。以下是关于nodejs客户端库的文档:

以下是
版本
说明:

要使用的签名版本,可以是“v2”或“v4”。默认为“v2”

客户端
PUT
请求成功:


演示url:

403通常表示您的凭据错误或丢失。您没有提供。飞行前请求是OPTIONS方法,但您尚未将其包含在可接受的HTTP方法列表中。尝试“方法”:[“获取”、“出售”、“选项”],感谢@BrandonYarbrough的回复。但这不是问题所在,因为选项请求已成功返回。(我还尝试将其添加到cors设置中,但结果没有改变。)同样的问题,得到403 cors错误。你能解释一下为什么缺少这些吗?对第一个请求的响应表示,访问控制请求头应该包括内容类型。后续请求确实包含Content-Type。因此,执行请求的功能大多缺失。要添加这些参数,您是否已将它们包含在请求头中?选项请求是否由XMLHttpRequest自动执行?您是否使用任何JS框架来执行调用?正如在另一条评论中提到的,为了执行复制,您请求的代码的代表性版本将非常有用。不幸的是,我正为此使用python。@user592419您可以检查python客户端库是否有
version
选项,然后再试一次。是的,我ofc做了检查,但没有。它只使用v2。