通过云功能访问Google Sheets Python API的身份验证问题

时间:2018-11-02 18:45:03

标签: python google-cloud-functions google-sheets-api google-oauth2 google-api-python-client

我正在尝试使用云函数和Python中的工作表API访问Google工作表,但出现403权限错误。我已经创建了一个服务帐户,导出了密钥(包含在我正在上传的云函数zip中),并为该服务帐户提供了访问工作表所需的API范围(我已经尝试过https://www.googleapis.com/auth/spreadsheets和{{3} }。这是代码:

import httplib2
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

def main(request):
  scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']

  credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secrets.json', scope)

  service = build('sheets', 'v4', http=credentials.authorize(httplib2.Http()))

  spreadsheet_id = 'id-of-the-google-sheet'

  range = 'Sheet1!A:D'

  response = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range).execute()

  cols = response.get('values', [])[0]
  return cols[0]

requirements.txt:

google-api-python-client
oauth2client
google-auth-httplib2
google-auth

如果我与服务帐户明确共享Google工作表,则身份验证确实有效,并且我可以访问工作表数据。问题是,为什么不能通过以Google帐户管理员的身份应用适当的API范围来实现此目的?

1 个答案:

答案 0 :(得分:0)

Google云端硬盘权限位于范围的顶部。范围是进行请求身份验证所必需的,但是驱动器权限(和扩展表)是确定谁可以访问哪个文件的权限。 如果主叫帐户(在这种情况下为serviceaccount)无法访问所涉及的工作表,则将获得您已经获得的403。

在管理控制台中设置范围与权限没有直接关系。

还要注意的一件事是,如果默认情况下G Suite帐户中的每个人都共享文档,则可以使用“域范围委托”(1),并使用serviceaccount来模拟G Suite中的用户(例如超级管理员)域。您无需与服务帐户本身共享每个文档。

(1)This one is for the Admin SDK,但这是包含最佳示例的文章。您对那里的凭证对象感兴趣。您还可以使用.json IIRC创建对象。