如何使用服务帐户访问 Google Doc Api?

Posted

技术标签:

【中文标题】如何使用服务帐户访问 Google Doc Api?【英文标题】:How to access Google Doc Api with service account? 【发布时间】:2020-04-13 13:53:44 【问题描述】:

我希望我的网络服务器通过服务帐户请求 google doc。我选择服务帐户的原因是我不希望用户提供任何登录信息。

尝试了下面的代码,但这会引发 The caller does not have permission 错误。

SCOPES = ['https://www.googleapis.com/auth/documents']
    SERVICE_ACCOUNT_FILE = 'xxx.json'

    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES
    )
    service = googleapiclient.discovery.build('docs', 'v1', credentials=credentials)
    response = service.documents().get(documentId='xxx').execute()

【问题讨论】:

【参考方案1】:

如果您不想冒充用户,则必须与驱动器中的服务帐户共享文档,以便授予其读/写权限

【讨论】:

【参考方案2】:

答案:

您需要确保服务帐户对其尝试读/写的文件具有访问权限。

更多信息:

The caller does not have permission 错误消息表明 ID 为 documentID 的文件具有共享权限,因此您使用的服务帐户无权执行您要求它执行的操作 - 无论是读取还是写入。

如果您确实无法模拟用户,则需要通过以下共享选项之一访问该文件:

如果服务帐户与拥有文件的用户位于不同的域中:

开启 - 在网络上公开 开启 - 知道链接的任何人

如果服务帐号与用户在同一个域中:

开启 - 您单位中的任何人都可以找到和访问 开启 - 组织中知道链接的任何人

或者,您可以通过选择Off - Specific people 并在文件本身的共享对话框的People 字段中输入服务帐户的电子邮件地址,直接与服务帐户共享。服务帐户的电子邮件地址可以在与其关联的 GCP 项目中找到 - 在 console.developers.google.com

参考资料:

GCP Developers Console Google Drive Help - Share files from Google Drive

【讨论】:

【参考方案3】:

关于创建服务帐户和阅读 Google 文档https://www.futurice.com/blog/read-goog-doc-using-service-account的说明

文档需要与服务帐户的电子邮件地址共享或公开共享。

【讨论】:

以上是关于如何使用服务帐户访问 Google Doc Api?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Google Drive .NET API v3 使用服务帐户访问 Team Drive

无法访问通过 Google 电子表格 API 通过服务帐户创建的工作表

如何使用API Explorer作为服务帐户?

如何使用服务帐户通过 .NET C# 访问 Google Analytics API V3?

将Google People API与服务帐户配合使用

无法使用服务帐户访问 Google REST Api