Google表格+ GoogleCredentials ="认证范围不足"

时间:2017-04-25 08:40:18

标签: python google-sheets-api

我正在创建一个需要读取大量电子表格的服务器应用程序。因此,我们使用GoogleCredentials.get_application_default()中的oauth2client.client,因为服务器可以访问服务帐户。对于本地开发,我想使用我的个人凭据,因此我使用的是Google Cloud SDK。我使用gcloud auth application-default login来确保有效。

创建服务就像这样简单:

from oauth2client.client import GoogleCredentials
from googleapiclient.discovery import build

credentials = GoogleCredentials.get_application_default()
service = build('sheets', 'v4', credentials=credentials)

事实上,到目前为止,对于一堆Google Cloud产品而言,这种方法运作良好。 但是,在使用Sheets API时,执行任何请求时会出现以下错误:

googleapiclient.errors.HttpError: 
<HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets/...
returned "Request had insufficient authentication scopes.">

这只适用于Google表格API,其他API(例如BigQuery V2 API)工作正常。

我已经检查过:

  • 已在Google Cloud项目上启用了表单API
  • 我可以访问Google Cloud项目的电子表格和编辑者权限
  • 我尝试了各种创建作用域凭据的方法,例如:

    credentials = GoogleCredentials.get_application_default()
    scoped_creds = credentials.create_scoped(SCOPES)
    

    但是,这似乎没有任何效果,因为create_scoped方法只返回self(source)。

  • 我在该项目上创建了一个服务帐户,并将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为指向它。这也很好,可能是因为它使用ServiceAccountCredentials实际上有create_scoped方法的实现。
  • 我使用的是最新版本的google-api-python-client(1.6.2)和oauth2client(4.0.0)

我在这里是正确的轨道还是我只是遗漏了一些非常愚蠢的东西?

2 个答案:

答案 0 :(得分:1)

我想我在the Google Identity Platform docs的底部找到了这个问题的(略微令人失望的)答案:

  

如果使用Google Cloud SDK gcloud auth application-default login命令提供您自己的身份以供本地使用,则该范围集目前已修复,但它包含所有Google Cloud API范围。如果您需要此集合之外的范围,建议使用下载的服务帐户密钥。

答案 1 :(得分:0)

尝试使用<script src="https://d3js.org/d3.v4.min.js"></script>代替apiclient.discovery。当我向googleapiclient.discovery传递太多args时,我遇到了同样的问题,但是一旦我删除了那些多余的args,它就可以工作了,我的代码与你的代码的唯一区别在于我从哪个模块中拉出build()