配额、孤立文件和使用带有 Google Drive API 的服务帐户上传

ber*_*nie 6 google-drive-api

语境

我正在构建一个需要将文件上传到属于用户的 Google 云端硬盘的 php 网络应用程序(我们称他为 Bob)。我使用了Google Drive 服务帐户(我们称之为 service@gmail.com)。

Bob 在他的 Google 云端硬盘中创建了一个文件夹(“上传”)并与 service@gmail.com 共享。

服务帐户 (service@gmail.com) 可以使用 Drive API 列出该共享上传文件夹中的文件并将文件上传到该文件夹​​。上传的文件也会显示在 Bob 的 Google Drive 中。到现在为止还挺好。

问题

正如人们所料,service@gmail.com 上传的文件的所有者是 service@gmail.com。这有以下后果:

  1. 由于 service@gmail.com 是上传文件的所有者,因此它们计入该帐户的配额。但是,Bob 为他的 Google Drive 购买了更多空间,并希望上传的文件计入他的配额,以免服务帐户中的空间不足。
  2. 当 service@gmail.com 先前上传的文件(由 Bob)从共享上传文件夹中删除时,会发生一些事情:
    • 删除的文件不会显示在任一用户的上传文件夹中。
    • Bob 仍然可以在他的“所有项目”视图中看到已删除的文件。
    • 当服务帐户通过 API 列出所有文件但它没有任何父文件(即它是孤立的)时,删除的文件仍然存在。
    • 通过 API 获取已删除文件的详细信息时,它显示它正在使用配额。

该怎么办?

如何(干净地)处理这个用例?我看到两种可能的解决方案:

  1. 上传文件时,将所有权设置为 Bob。那可能吗?这不起作用!首先,它不适用于普通帐户的上传文件。其次,服务帐户有一个电子邮件@developer.gserviceaccount.com,而 Bob 的帐户有@gmail.com。从文档说:

Google Apps 客户:您不能让域外的人成为您的 Google 文档的所有者。只有专业版、政府版和教育版域中的 Google Apps 客户可以转让已同步或上传的文件(如 PDF 或图像文件)的所有权。

消费者云端硬盘用户:您无法转让已同步或上传的文件(如 PDF 或图像文件)的所有权。

  1. 不要使用服务帐户,而是让网络应用直接使用 Bob 的帐户。但是,这确实需要为 Bob 获取 OAuth 访问令牌。此外,使用具有共享上传文件夹的服务帐户允许我将服务帐户的访问权限限制为仅上传文件夹。
  2. 定期在服务帐户中搜索孤立文件以清理它们。然而,这并不能解决用于未删除文件的配额问题...

请帮忙!

有关离线访问和访问令牌的信息

Mic*_*ber 2

我认为您应该看到此页面:执行 Google Apps 域范围内的授权。本页展示如何使用 SA 代表Bob用户调用请求。此页面包含Java描述如何DriveBob. 使用此功能,Drive您将能够上传文件,并且文件的所有者将不是Bobservice@gmail.com。我经常使用这种方法并且它对我很有效。