GCS:我尝试使用POSTMAN

时间:2018-07-12 16:44:35

标签: python google-cloud-storage postman pre-signed-url

我已经在寻找解决方案已有一段时间了,但是我找不到任何能够解决我问题的方法。我对使用签名的URL有点陌生,所以如果我遗漏了一些明显的内容,请原谅我。

我正在尝试将.tif / .tiff文件上传到GCS存储桶,并能够使用以下代码成功签名URL:

def _Base64Sign(self, plaintext):
"""Signs and returns a base64-encoded SHA256 digest."""
shahash = SHA256.new(plaintext)
signer = PKCS1_v1_5.new(self.key)
signature_bytes = signer.sign(shahash)
return base64.b64encode(signature_bytes)

def _MakeSignatureString(self, verb, path, content_md5, content_type):
"""Creates the signature string for signing according to GCS docs."""
signature_string = ('{verb}\n'
                    '{content_md5}\n'
                    '{content_type}\n'
                    '{expiration}\n'
                    '{resource}')
return signature_string.format(verb=verb,
                               content_md5=content_md5,
                               content_type=content_type,
                               expiration=self.expiration,
                               resource=path)

def _MakeUrl(self, verb, path, content_type='', content_md5=''):
"""Forms and returns the full signed URL to access GCS."""
newpath = "/" + path
base_url = '%s%s' % (self.gcs_api_endpoint, newpath)
signature_string = self._MakeSignatureString(verb, newpath, content_md5,
                                             content_type)
logging.info("1. " + signature_string)
signature_signed = self._Base64Sign(signature_string)
logging.info("2. " + signature_signed)
query_params = {'GoogleAccessId': self.client_id_email,
                'Expires': str(self.expiration),
                'Signature': signature_signed}
return base_url, query_params

def Get_Signed_Url(self, fileName, md5):
  """Performs a POST request

  Args:
    filename: The file to upload.
    md5: the md5 hash

  Returns:
    A signed url to upload a file.
  """

  base_url, query_params = self._MakeUrl('PUT', fileName, 'image/tiff', md5)

  url_formatted_sig = urllib.urlencode(query_params)

  signed_url = "{}?{}".format(base_url,url_formatted_sig)

  return signed_url

我用来签名的标头是动词,Content-MD5,Content-Type,到期时间和资源。

接收到签名的URL后,我使用邮递员对URL进行PUT请求,并包含具有相应值的标头 Content-MD5 和具有 Content-Type 的标头“图像/ tiff”。但是,每当我尝试发出此请求时,我都会收到此错误:

Request Response

我了解了很多有关StringToSign如何与代码中的字符串匹配的信息,但是,每当我在代码中记录/打印signature_string(在我对其进行签名之前)时,我都会得到它(据我所知与StringToSign匹配)可以看出来):

2018-07-12 10:53:50.945 CDT
1. PUT
t01JA1Dord60By5+X1RL7g==
image/tiff
1531414430
/mlfc-initial/2018-28/e900a4b3-4f72-40dc-b634-07d437bf6eed/1.tif

忽略“ 1”,因为我只是将其添加到日志记录语句的前面以将其与其他语句区分开。

我尝试对标头进行编码,并尝试对标头进行各种组合但均未成功。为了解决这个问题,我没有其他可尝试的方法了,所有帮助将不胜感激!再次致歉,如果我错过了一些简单的事情,因为我对此很陌生,请告诉我是否需要我添加其他内容。

0 个答案:

没有答案