GCP响应说malformmedsecurityheader内容类型不在请求中,但它在



首先,我很抱歉在这里粘贴了这么多代码,但是在这个过程的每个步骤中都有很多可能出错的地方,我试图确保我遇到的每个错误都记录在这里,所以没有来回的沟通。

我试图创建一个签名的上传url从浏览器发送一些文件到gcp桶。

我在go中创建了一个签名上传url,就像这样

func generateV4PutObjectSignedURL(bucket, object string) (string, error) {
ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
return "", fmt.Errorf("storage.NewClient: %v", err)
}
defer client.Close()
pkey, err := ioutil.ReadFile("key.pem")
check(err)
opts := &storage.SignedURLOptions{
PrivateKey:  pkey,
Scheme:      storage.SigningSchemeV4,
Method:      "PUT",
ContentType: "video/wav",
Expires:     time.Now().Add(20 * time.Hour),
}
u, err := client.Bucket(bucket).SignedURL(object, opts)
if err != nil {
return "", fmt.Errorf("Bucket(%q).SignedURL: %v", bucket, err)
}
return u, nil
}

键。Pem具有所有可能的权限。

我像这样发送文件

const reader = new FileReader();
console.log(file);
reader.onabort = () => console.log("file reading was aborted");
reader.onerror = () => console.log("file reading has failed");
reader.onload = () => {
const binaryFile = reader.result;
const blob = new Blob([binaryFile], { type: file.type });
var request = new XMLHttpRequest();
request.open("PUT", uploadUrl, true);
request.setRequestHeader("Content-Type", file.type);
request.onload = (e) => {
if (request.status === 200) {
poll();
}
};
request.send(blob);
};
reader.readAsArrayBuffer(file);

我收到了这个错误

Access to XMLHttpRequest at {THE_SIGNED_URL} from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

桶中的CORS配置如下

[{"maxAgeSeconds": 86400, "method": ["*"], "origin": ["*"], "responseHeader": ["*"]}]

得到的XML错误是这个

<Error>
<Code>MalformedSecurityHeader</Code>
<Message>Your request has a malformed header.</Message>
<ParameterName>content-type</ParameterName>
<Details>Header was included in signedheaders, but not in the request.</Details>
</Error>

但是chrome开发者网络选项卡说Content-Type标头存在于请求中,这正是我所说的后端。

我做错了什么?

即使您正确配置了CORS, GCP也会使您收到CORS错误!

我最终通过从请求中删除内容类型头来解决这个问题。

在我这样做之后,CORS问题又出现了,我最终发现它实际上不是CORS问题,而是GCS问题。

我不知道到底发生了什么,但我想谷歌在添加CORS头说你很好(Access-Control-Allow-Origin)之前做了一些你的OPTIONS预飞行请求。如果这个过程中有什么东西坏了,它会返回没有这个头的答案,这样你的浏览器就知道你没有通过CORS验证。

使用一些自动将此头添加到您收到的每个请求的工具,可以让您查看请求的正文和请求的实际问题。有一些chrome扩展可以做到这一点。

在我的情况下,问题是我需要在签名上传签名请求时使用服务帐户电子邮件,但您的可能不同。

相关内容

  • 没有找到相关文章