我正在尝试使用云功能和python中的工作表API访问Google工作表,但获得403权限错误。我创建了一个服务帐户,导出了密钥(包含在我正在上传的云功能zip中),并为该服务帐户提供了访问工作表所需的API范围(我已经尝试了https://www.googleapis.com/auth/spreadsheets和https://www.googleapis.com/auth/drive)。这是代码:
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表格,则身份验证确实有效,我可以访问工作表数据。问题是为什么通过将适当的API范围应用为Google帐户管理员,这是否有效?
Google云端硬盘权限位于范围之上。验证请求需要范围,但驱动器权限(和扩展名表)决定谁有权访问哪个文件。如果主叫帐户(在这种情况下为serviceaccount)无法访问相关表格,您将获得您获得的403。
在管理控制台中设置范围与权限没有直接关联。
还有一点需要注意,如果您默认情况下将文档共享给G Suite帐户中的每个人,则可以使用域范围授权(1)并使用serviceaccount模拟G Suite域内的用户(如superadmin)。您不需要使用serviceaccount本身共享每个文档。
(1)This one is for the Admin SDK,但这是包含最好例子的文章。你对那里的凭证对象感兴趣。您还可以使用.json IIRC创建对象。