python - 通过云函数访问 Google Sheets Python API 的身份验证问题
问题描述
我正在尝试使用云函数和 python 中的工作表 API 访问 Google 工作表,但出现 403 权限错误。我创建了一个服务帐户,导出了密钥(包含在我正在上传的云功能 zip 中)并为该服务帐户提供了访问工作表所需的 API 范围(我已经尝试了https://www.googleapis.com/ auth/电子表格和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]
要求.txt:
google-api-python-client
oauth2client
google-auth-httplib2
google-auth
如果我明确与服务帐户共享 Google 表格,则身份验证确实有效,并且我可以访问表格数据。问题是为什么不能通过应用适当的 API 范围作为 Google 帐户管理员来工作?
解决方案
Google 云端硬盘权限位于范围之上。请求的身份验证需要范围,但驱动器权限(以及扩展名的表格)决定了谁可以访问哪个文件。如果调用帐户(在这种情况下为服务帐户)无权访问相关工作表,您将获得您所获得的 403。
在 Admin Console 中设置范围与权限没有直接关联。
还有一点需要注意,如果您在默认情况下将文档共享给 G Suite 帐户中的每个人,您可以使用域范围委派 (1) 并使用服务帐户模拟 G Suite 域内的用户(如超级管理员)。您不需要与服务帐户本身共享每个文档。
(1)这一篇是针对 Admin SDK 的,但这是包含最佳示例的文章。您对那里的凭证对象感兴趣。您还可以使用 .json IIRC 创建对象。
推荐阅读
- java - 如何在不将活动切换到android中的默认呼叫应用程序的情况下拨打电话?
- azure - Azure - 无法获得“网络配置文件”
- android - CameraX 预览未显示在 PreviewView 中
- distance - 测量两个概率分布之间的重叠
- android - 我可以用带红外线的安卓手机来控制灯条吗
- c# - 简洁的嵌套对象
- node.js - npm install 导致无法读取未定义的属性“名称”
- windows - 如何使用命令行在 Windows 10 中查找和替换文件名中的字符?
- laravel - Laravel Sail on Windows Subsystem for Linux (wsl)
- javascript - 如何在antd pro中更改Form.List的默认字段