Google Cloud Storage JSON API 简单上传认证

1 投票
1 回答
1224 浏览
提问于 2025-04-18 04:27

我在用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 库 可以处理大部分麻烦的细节。

撰写回答