我正在创建一个需要读取大量电子表格的服务器应用程序。因此,我们使用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)工作正常。
我已经检查过:
我尝试了各种创建作用域凭据的方法,例如:
credentials = GoogleCredentials.get_application_default()
scoped_creds = credentials.create_scoped(SCOPES)
但是,这似乎没有任何效果,因为create_scoped
方法只返回self(source)。
GOOGLE_APPLICATION_CREDENTIALS
设置为指向它。这也很好,可能是因为它使用ServiceAccountCredentials
实际上有create_scoped
方法的实现。我在这里是正确的轨道还是我只是遗漏了一些非常愚蠢的东西?
答案 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()