Google Cloud Storage JSON API 简单上传认证
我在用Python实现GCS JSON API中的“简单上传”方法时遇到了麻烦。文档看起来很简单,但我在授权这一步卡住了。我对授权、认证、密钥和令牌这些概念不是很明白,但我在努力尝试。我想上传的存储桶是公开的,允许完全的读写权限,我也尝试了各种组合的密钥。
我的代码:
def postTest():
headers = {'Host':'www.googleapis.com','Authorization':'Bearer? WHATGOESINHERE?','Content-Length': 0, 'Content-Type': "text/plain"}
files = {'file': ('report.txt', 'justsomeblankityblanktext\n')}
r = requests.post("https://storage.googleapis.com/upload/storage/v1beta2/b/NOTACTUALLYAREALBUCKETOBVIOUSLY/o?uploadType=media&name=testi.txt", headers=headers, files=files)
print(r.request.headers)
print(r.url)
print(r.text)
然后返回的结果是:
CaseInsensitiveDict({'Content-Length': '172', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'python-requests/2.2.1 CPython/2.7.6 Darwin/13.1.0', 'Host': 'www.googleapis.com', 'Content-Type': 'text/plain', 'Authorization': 'Bearer? WHATGOESINHERE?'})
https://storage.googleapis.com/upload/storage/v1beta2/b/NOTACTUALLYAREALBUCKETOBVIOUSLY/o?uploadType=media&name=testi.txt
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
所以,我的问题是关于请求头中的“授权”键值对。我应该包含什么样的“授权令牌”?
1 个回答
0
OAuth2 授权有点复杂。简单来说,它的想法是,你不需要一直用真实的密码去做所有事情,而是先用一次密码获取一个临时代码,这个代码大约能用一个小时。之后你就可以用这个代码去做其他事情。如果这个代码被泄露了,没关系,因为它也会在一个小时后失效。更复杂的是,OAuth 还允许你请求凭证来代表最终用户操作(比如,如果你在做一个云存储的网页查看器,你可能想让用户登录,但又不想知道他们的 Google 密码)。
获取访问令牌的方法是向 Google 的 OAuth2 服务请求一个。你可以根据想要的授权方式选择不同的方法。如果你的应用程序总是以自己的身份运行,你可以下载一个私钥,用它来创建一个声明。这里有相关的说明。
另一个常见的用例是一个代表用户的应用。在这种情况下,你会创建一个登录链接,让用户去那个链接登录,然后你的应用会收到一个密钥(或者用户会得到一个密钥,让他们粘贴到你的应用里),这个密钥会给你一个永久的“刷新令牌”,你可以用它随时请求新的访问令牌。安装应用的说明在这里。
还有其他几种情况。总的来说,这个过程有点复杂,这也是为什么 Google 提供了一个 Python 客户端,可以帮你处理 OAuth2 授权。你仍然需要考虑想用什么样的认证方式,但 Google APIs Python 库 可以处理大部分麻烦的细节。