File upload 将请求放入由Shopify生成的google云存储签名URL会抛出错误格式错误的安全头
我正在尝试通过Shopify GraphQL管理API将.glb文件上载到Shopify商店中的产品。为此,它首先返回一个谷歌云存储签名URL,我应该通过HTTP PUT请求将文件上传到该URL。上传后,我应该通过另一个API调用将相同的URL附加到产品 这个问题是关于文件上传到云存储签名URL的问题。我包括所有这些细节,使这个问题很容易得到回答所以,请一直读到最后File upload 将请求放入由Shopify生成的google云存储签名URL会抛出错误格式错误的安全头,file-upload,google-cloud-storage,shopify,pre-signed-url,shopify-api,File Upload,Google Cloud Storage,Shopify,Pre Signed Url,Shopify Api,我正在尝试通过Shopify GraphQL管理API将.glb文件上载到Shopify商店中的产品。为此,它首先返回一个谷歌云存储签名URL,我应该通过HTTP PUT请求将文件上传到该URL。上传后,我应该通过另一个API调用将相同的URL附加到产品 这个问题是关于文件上传到云存储签名URL的问题。我包括所有这些细节,使这个问题很容易得到回答所以,请一直读到最后 Shopify为我提供的数据如下所述 使用这些参数,我构建了一个签名URL,如下所示 例如: 然后我尝试使用POSTman中的.
有人能指出我做错了什么吗?我已经处理这个错误好几天了,读了很多问题和文章,但都没能让它起作用。因此,我们非常感谢您提出的任何有益建议。请您尝试以下建议:
- 生成初始请求时(本例中Shopify就是这样做的),GCS通常会包含该请求的HTTP头,并将其包含在请求签名中,并期望上载请求(您正试图执行的请求)与相同的HTTP头值相匹配。 这意味着建议您在签名密钥上载请求中只包含请求中指定的头文件Shopify,而不包含任何额外内容。因此,首先尝试删除Shopify未记录的所有HTTP头(例如,由POSTMAN添加的头),并确保所有头值都遵循Shopify文档(例如,内容类型应匹配)
- 您需要确保签名参数采用预期的名称和格式:
- 签名值字段的名称为:
而不是x-goog-signature
(这可能是GCS无法找到预期参数的错误原因)signature
- 您可能还必须提供签名算法密钥(
)x-goog-algorithm
- 根据身份验证等其他因素,您可能还需要其他密钥 我认为这些应该通过Shopify SDK和/或示例进行记录
很抱歉,我没有使用Shopify,但以上是我使用GCS签名URL的经验是的,正如您所提到的,我也尝试使用
x-goog-signature
而不是signature
等等。但是,如果我这样使用,它需要x-goog-credential
param的一个值,但是Shopify提供的所有param值都与该param值不匹配,即导致错误。正如您在回答中提到的,这些内容应该在Shopify API文档中明确提到,但没有找到。我还向Shopify技术支持发送了电子邮件,他们承诺很快会将这些信息添加到文档中,但我不知道什么时候会发生,我希望尽快解决这个问题。
{
"data": {
"stagedUploadsCreate": {
"stagedTargets": [
{
"parameters": [
{
"name": "GoogleAccessId",
"value": "threed-model-service--6bgx7cbe@shopify-applications.iam.gserviceaccount.com"
},
{
"name": "key",
"value": "models/a6436c066064bac3/windmill.glb"
},
{
"name": "policy",
"value": "eyJleHBpcmF0aW9uIjoiMjAyMC0wNy0yMVQwOToxNjoxMFoiLCJjb25kaXRpb25zIjpbWyJlcSIsIiRidWNrZXQiLCJ0aHJlZWQtbW9kZWxzLXByb2R1Y3Rpb24iXSxbImVxIiwiJGtleSIsIm1vZGVscy9hNjQzNmMwNjYwNjRiYWMzL3dpbmRtaWxsLmdsYiJdLFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLDE5NzE3MiwxOTcxNzJdXX0="
},
{
"name": "signature",
"value": "vz+OdcEmD9Kbv2FbXdxWNUk59XO2GmXzhvtDswXbDQNcyZpUufI85z5x2PFGv/XZ+tSBsl/S393pmy0Bu9xG7oVgOZcMIWEbOIm9kXgQunbjKQY3Ff3BBpMocB0xazzlYmckZozdJ8ZZkyox/c/gEe1QaxqW4+419iufuFHy4Bp3LL/aUr+ATNChwn9Dn8+XnHMOckZxDlbiggcF3dx+yBuTFia8FneaVSiU0M5DIWmHqHb2YDCV0KtEP6jfTj/PQVUjS8pn8EGhrRaMx7Q2A5G8Pycgc9H35hqJnnUKCTa3AYeyI45RbhddYnIWw9YrAADXuQYlVCo6LYBHjxsCWA=="
}
],
"resourceUrl": "https://storage.googleapis.com/threed-models-production/models/a6436c066064bac3/windmill.glb?external_model3d_id=bW9kZWwzZC00MDg5Ng==",
"url": "https://storage.googleapis.com/threed-models-production/models/a6436c066064bac3/windmill.glb?external_model3d_id=bW9kZWwzZC00MDg5Ng=="
}
],
"userErrors": []
}
}
}
resourceUrl+"&signature="+signature+"&key="+key+"&policy="+policy+"&GoogleAccessId="+GoogleAccessId
<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>MalformedSecurityHeader</Code>
<Message>Your request has a malformed header.</Message>
<ParameterName>signature</ParameterName>
<Details>Signature was not base64 encoded</Details>
</Error>