谷歌云在使用 PostMan 时签署了 url “SignatureDoesNotMatch”,但在 Python 中运行良好

Posted

技术标签:

【中文标题】谷歌云在使用 PostMan 时签署了 url “SignatureDoesNotMatch”,但在 Python 中运行良好【英文标题】:Google Cloud signed url "SignatureDoesNotMatch" when using PostMan but works fine with Python 【发布时间】:2018-02-03 20:41:14 【问题描述】:

您好,我已经生成了一个签名 url 以上传到谷歌云存储桶,但是当我尝试 PUT 时,我得到 SignatureDoesNotMatch,奇怪的是只有 PostMan。当我在 Python 中尝试相同的 Url、queryParams、Headers 时,我能够正常上传。

这是我在 PostMan 中尝试过的请求

URL:https://storage.googleapis.com/ **** - 171020.appspot.com/swift.txt?GoogleAccessId=storageadmin@****-171020.iam.gserviceaccount.com&Expires=1503755879&Signature=tlcHVRwbvMSxaIB6oO/TDXRDczXGFSE6ZXHmZbtCUMhjpos36/1KdKV7Lbmm7XtKsq42SFNksUIZLplyAMpkG8aMBuydeoJd+kvebLxK2k+ AX8Xr2VVf5Aq / vVJrPGGYGD0iEN + bY264NIFbyJnlm0pthCVGtB5YqZJadCFDwPFWqi04312Jzzen1CXDY + saY0BabmXaZeCzINz7kV + aq0AJoS8taW0uqboYc1o4gCA6OPAswMr1E840a + II4HqkeOWcv7PiHEPdw / sgH3PR + TkGmjTAd9f8H6zJIFaT8DLbtsl7t3iAUM7Fvdtc9pGQt6KT0qUm9z3XfPEjP8OsTA ==

标题: 内容-MD5:7Qdih1MuhjZehB6Sv8UNjA== 内容类型:text/plain

这是一个可以运行的 Python 程序:

import requests

url = "https://storage.googleapis.com/****-171020.appspot.com/swift.txt"
querystring = 'GoogleAccessId':'storageadmin@****-171020.iam.gserviceaccount.com', 'Expires':'1503755879', 'Signature':'tlcHVRwbvMSxaIB6oO/TDXRDczXGFSE6ZXHmZbtCUMhjpos36/1KdKV7Lbmm7XtKsq42SFNksUIZLplyAMpkG8aMBuydeoJd+kvebLxK2k+AX8Xr2VVf5Aq/vVJrPGGYGD0iEN+bY264NIFbyJnlm0pthCVGtB5YqZJadCFDwPFWqi04312Jzzen1CXDY+saY0BabmXaZeCzINz7kV+aq0AJoS8taW0uqboYc1o4gCA6OPAswMr1E840a+II4HqkeOWcv7PiHEPdw/sgH3PR+TkGmjTAd9f8H6zJIFaT8DLbtsl7t3iAUM7Fvdtc9pGQt6KT0qUm9z3XfPEjP8OsTA=='
payload = "Hello World!"
headers = 'Content-MD5': '7Qdih1MuhjZehB6Sv8UNjA==', 'Content-Type':'text/plain'

response = requests.request("PUT", url, data=payload, headers=headers, params=querystring)

print(response.text)

请帮助我了解这里发生了什么。谢谢!

【问题讨论】:

我相信你的问题是你如何在邮递员中定义你的标题。尝试用实际的键和值替换“键”和“值”。例如: "Content-MD5": "7Qdih1MuhjZehB6Sv8UNjA==" 而不是 "key": "Content-MD5"... @AllenMoh 这正是我尝试复制时邮递员添加到剪贴板的方式,并进行了编辑以避免混淆。 你是如何登录python的? 【参考方案1】:

查询字符串中的键和值需要进行 uri 编码。您获得“SignatureDoesNotMatch”的原因是,在接收方,他们正在对您提供的内容进行 uri 解码,期望它是 uri 编码的,并且由于您提供的内容未编码,因此解码会产生不同的签名。

有关保留字符,请参阅此链接: https://www.rfc-editor.org/rfc/rfc2396#section-2

帮助您对查询字符串进行编码的在线工具: http://www.url-encode-decode.com/

您的 python 代码工作的原因是请求库自动对查询字符串参数进行 uri 编码。

【讨论】:

谢谢艾伦,是的,编码是不同的,它修复了它。 :)

以上是关于谷歌云在使用 PostMan 时签署了 url “SignatureDoesNotMatch”,但在 Python 中运行良好的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云/firebase 存储错误:无法在没有“client_email”的情况下签署数据。 ...名称:'SigningError'

如何使用签名的 URL 将文件上传到谷歌云存储桶

使用 multer 和 nodejs 将图像上传到谷歌云存储时出错

使用 ajax 通过签名的 url 将文件上传到谷歌云存储

通过 iOS 应用触发谷歌云功能的最佳方式

谷歌云存储 CNAME URL 重定向