Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File upload 将请求放入由Shopify生成的google云存储签名URL会抛出错误格式错误的安全头_File Upload_Google Cloud Storage_Shopify_Pre Signed Url_Shopify Api - Fatal编程技术网

File upload 将请求放入由Shopify生成的google云存储签名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 GraphQL管理API将.glb文件上载到Shopify商店中的产品。为此,它首先返回一个谷歌云存储签名URL,我应该通过HTTP PUT请求将文件上传到该URL。上传后,我应该通过另一个API调用将相同的URL附加到产品

这个问题是关于文件上传到云存储签名URL的问题。我包括所有这些细节,使这个问题很容易得到回答所以,请一直读到最后

  • Shopify为我提供的数据如下所述
  • 使用这些参数,我构建了一个签名URL,如下所示
  • 例如:

  • 然后我尝试使用POSTman中的.glb文件对此URL发出PUT请求,如图所示-->
  • 使用以下标题

  • 但我没有得到成功的回应。事实上,我得到了一个400错误与以下消息

  • 有人能指出我做错了什么吗?我已经处理这个错误好几天了,读了很多问题和文章,但都没能让它起作用。因此,我们非常感谢您提出的任何有益建议。

    请您尝试以下建议:

    • 生成初始请求时(本例中Shopify就是这样做的),GCS通常会包含该请求的HTTP头,并将其包含在请求签名中,并期望上载请求(您正试图执行的请求)与相同的HTTP头值相匹配。 这意味着建议您在签名密钥上载请求中只包含请求中指定的头文件Shopify,而不包含任何额外内容。因此,首先尝试删除Shopify未记录的所有HTTP头(例如,由POSTMAN添加的头),并确保所有头值都遵循Shopify文档(例如,内容类型应匹配)
    • 您需要确保签名参数采用预期的名称和格式:
    • 签名值字段的名称为:
      x-goog-signature
      而不是
      signature
      (这可能是GCS无法找到预期参数的错误原因)
    • 您可能还必须提供签名算法密钥(
      x-goog-algorithm
    • 根据身份验证等其他因素,您可能还需要其他密钥 我认为这些应该通过Shopify SDK和/或示例进行记录
    一个简化/加速事情的建议可能是使用googlecloudutils(gsutil命令行工具)创建一个签名url请求,然后尝试在代码中重现相同的行为 有关更多信息,请参阅以下链接:

    然后,在熟悉签名url格式后,您可以查看以下示例代码,了解如何在自己的代码中执行此操作:

    为了便于阅读文档时参考,您尝试创建的签名URL类型为不可恢复上载(使用单个PUT请求),而不是可恢复上载(使用初始POST加上一系列PUT)
    很抱歉,我没有使用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>