Google云端硬盘上传脚本的OAuth2服务帐户凭据

时间:2015-10-27 11:50:09

标签: python google-drive-api google-oauth

如果有人之前已经问过这个问题,请提前道歉,但我已经有一些关于服务器端Python脚本的基本问题我写的每夜上传CSV文件到我们Google的文件夹中开车帐户。文件夹所有者已创建Google API项目,为此启用了Drive API,并创建了一个我已作为JSON文件下载的凭据对象。该文件夹已与服务帐户电子邮件共享,因此我认为该脚本一旦获得授权,即可访问此文件夹。

JSON文件包含以下字段private_key_idprivate_keyclient_emailclient_idauth_uritoken_uri,{{1} },auth_provider_x509_cert_url

  1. 我猜测我的脚本不需要所有这些 - 这是OAuth2授权的必要或必填字段?

  2. 此处给出的示例Python脚本

  3. https://developers.google.com/drive/web/quickstart/python

    似乎假设直接从JSON文件中检索凭证:

    client_x509_cert_url

    但是在我们的设置中,我们将它们存储在我们自己的数据库中,脚本通过dict访问它们。如果证书在dict中,授权将如何进行?

    提前致谢。

2 个答案:

答案 0 :(得分:2)

浏览源代码后,似乎只能接受JSON文件。他们正在使用simplejson进行编码和解码。看一下源代码:

This是从您提供的文件中获取内容的地方:

 62 def locked_get(self): 
 63      """Retrieve Credential from file. 
 64   
 65      Returns: 
 66        oauth2client.client.Credentials 
 67   
 68      Raises: 
 69        CredentialsFileSymbolicLinkError if the file is a symbolic link. 
 70      """ 
 71      credentials = None 
 72      self._validate_file() 
 73      try: 
 74        f = open(self._filename, 'rb') 
 75        content = f.read() 
 76        f.close() 
 77      except IOError: 
 78        return credentials 
 79   
 80      try: 
 81        credentials = Credentials.new_from_json(content) #<----!!!
 82        credentials.set_store(self) 
 83      except ValueError: 
 84        pass 
 85   
 86      return credentials 

new_from_json中,他们尝试使用simplejson解码内容。

 205 def new_from_json(cls, s): 
 206      """Utility class method to instantiate a Credentials subclass from a JSON 
 207      representation produced by to_json(). 
 208   
 209      Args: 
 210        s: string, JSON from to_json(). 
 211   
 212      Returns: 
 213        An instance of the subclass of Credentials that was serialized with 
 214        to_json(). 
 215      """ 
 216      data = simplejson.loads(s) 

长话短说,似乎你必须从你的dict构造一个JSON文件。见this。基本上,您需要json.dumps(your_dictionary)并创建一个文件。

答案 1 :(得分:0)

实际上看起来SignedJwtAssertionCredentials可能是一个答案。另一个可能是

from oauth2client import service_account
...
credentials = service_account._ServiceAccountCredentials(
      service_account_id=client.clid,
      service_account_email=client.email,
      private_key_id=client.private_key_id,
      private_key_pkcs8_text=client.private_key,
      scopes=client.auth_scopes,
)
....