Google云端存储JSON API简单上传身份验证

时间:2014-04-27 12:30:27

标签: python cryptography google-cloud-storage pycrypto

我很难获得“简单上传”功能。 GCS JSON API中的方法可以在Python中工作。文档(https://developers.google.com/storage/docs/json_api/v1/how-tos/upload#simple)使其显得微不足道,但我无法通过授权。我不完全理解授权/认证/密钥/令牌,但我正在尝试。我一直试图上传的存储桶允许完全读写(他们是公开的),并且我已经生成并尝试了我能想到的每个组合和排列的密钥

我的代码:

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 :(得分:0)

OAuth2授权有点棘手。我们的想法是,不是一直使用您的真实密码,而是使用您的密码一次,以获得适用于下一个小时左右的临时代码。然后你将这个代码用于所有东西,如果由于某种原因它被泄露,它将在一小时左右停止工作。为了增加更复杂的功能,OAuth还允许您要求凭据充当最终用户(例如,如果您在网络上创建云存储查看器,您可能希望让人们登录,但您不想要知道他们的谷歌密码。)

获取访问令牌的方法是向Google的OAuth2服务询问。您可以通过几种方式执行此操作,具体取决于您要授权的方式。如果您的应用程序始终充当自身,您可以为其下载可用于创建断言的私钥。 Here're the instructions for this

另一个常见用例是一个充当你的应用。在这种情况下,您将创建一个指向登录URL的链接,让用户在那里导航并登录,然后您的应用程序将收到一个密钥(或者用户将获得一个粘贴到您的应用程序中的密钥),它将为您提供永久的“刷新令牌”,您可以在需要时使用它来请求新的访问令牌。 Instructions for installed apps are here

还有其他一些东西。最终它有点复杂,这就是为什么Google提供了一个可以为您处理OAuth2授权的Python客户端。您仍然需要考虑要使用哪种身份验证,但Google APIs Python Library可以处理大部分混乱的细节。