Google 云签名 url "SignatureDoesNotMatch" 使用 PostMan 时使用 Python

Google Cloud signed url "SignatureDoesNotMatch" when using PostMan but works fine with Python

您好,我已经生成了一个已签名的 url 以上传到 google 云存储桶,但是当我尝试 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==

Headers: 内容-MD5:7Qdih1MuhjZehB6Sv8UNjA== Content-Type: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)

请帮助我了解这里发生的事情。谢谢!

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

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

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

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