如何使用 Google 驱动器 Api 和服务帐户获取加星标的文件?

How to get starred files using the Google Drive Api and a service account?

我正在本地开发一个应用程序,最终将 运行 在 Go 中的 Google App Engine 上。

我正在使用云文档中建议的服务帐户密钥:

https://cloud.google.com/docs/authentication

Accessing private data on behalf of a service account outside Google Cloud environments

Recommendation: Service account key

这是预期的工作流程:

  1. 管理员创建了一个与 select 用户和服务帐户共享的云端硬盘文件夹。
  2. 用户可以在该共享文件夹中创建文件。
  3. 管理员可以为这些文件中的 select 加注星标并调用该应用程序。
  4. 应用程序查询该共享文件夹中加星标的文件并处理这些文件。

现在,如果管理员使用文件:列表“试试这个 API”,地址:

https://developers.google.com/drive/api/v3/reference/files/list

使用此查询字符串:

parents in 're89w...r9d9' and starred

然后显示加星标的文件。

然而,当我的应用程序使用相同的字符串时:

q := "parents in '" + folderID + "' and starred "
fl, err = srvDrive.Files.List().PageSize(100).Q(q).Fields("nextPageToken, files(name)").Do()

那么fl是一个空列表;没有加星标的文件。

我怀疑它与使用服务帐户有关,并且可能有一种方法可以通过某种方式模拟某些内容来解决此问题,但是文档很深入,我不确定它是否会有所帮助,如果我搞清楚。

我的应用程序如何查询管理员驱动器中加星标的文件?

从你的提问中了解到,你目前的情况是这样的。

  • 您想从特定文件夹中检索带有星标的文件的文件列表。
  • 该文件夹在您的帐户和服务帐户之间共享,您可以在 Google 驱动器中看到加星标的文件。
  • 您想使用 golang 的 googlapis 实现此目的。

我遇到了同样的情况。我认为这是服务帐户的错误或当前规范。

因为例如files(name,starred)用于fields时,即使文件夹中存在带星号的文件,starred的字段始终是false 用于所有文件。我认为这就是问题的原因。

所以在现阶段,我认为不幸的是,无法使用服务帐户直接检索已加星标的文件列表。当您想要检索已加星标的文件列表时,以下解决方法如何?

解决方法 1:

在此解决方法中,可以使用从 OAuth2 而非服务帐户检索到的访问令牌来检索特定文件夹中的文件列表。在这种情况下,可以检索已加星标的文件列表。

解决方法 2:

在此解决方法中,文件列表是使用由 Google Apps 脚本创建的 Web 应用程序检索的,当 golang 脚本向 Web 应用程序请求时,将返回文件列表。在这种情况下,可以使用从服务帐户检索到的访问令牌。此外,这可以在不使用访问令牌的情况下使用。在此解决方法中,Web 应用程序用作 API。至此,虽然在方案1中,要求在golang的脚本中使用OAuth2进程,但本方案可以避免,可以使用服务账号。

注:

  • 例如,将其作为未来请求报告给 Google 问题跟踪器如何? Ref
  • 顺便说一下,在您的脚本中,q := "parents in '" + folderID + "' and starred " 用作搜索查询。当我看到the official document时,似乎'1234567' in parents。但是,当我测试 parents in '1234567' 时,我确认可以使用它。我以为这个规格可能会改变。
  • 另外,我认为在这种情况下,将 trashed = false 包含在 fields 中可能是合适的。

参考文献:

问题:

文件本身未加星标。文件已为特定用户 加星标 ,如您所见 here:

starred: Whether the user has starred the file.

这意味着某个帐户 (#1) 可以为某个文件加注星标,而另一个帐户 (#2) 则没有。因此,当使用 #1 查询 starred 文件时,文件将被 returned,而当使用 #2 时,它不会。我认为这就是这里发生的情况:您的常规(管理员)帐户已为某些文件加星标,而您的服务帐户(这是一个完全不同的帐户)没有。

因此,我认为这不是 Google 方面的问题:服务帐户可用于 return 他们已加星标的文件。我通过 (1) 使用服务帐户为文件加星标和 (2) 通过 q="starred" 查询加星标的文件来检查情况是否如此。已加星标的文件 returned.

解决方案:

如果您想使用服务帐户检索由普通用户加星标的文件,您应该授予服务帐户域范围的权限并使用它来模拟用户。

如果您想避免全域委派,解决方法 #2 也是一个不错的选择。

更新:

您正在使用 Go,不幸的是相应的 API 库还没有包含使用服务帐户模拟域用户的功能。这是来自库回购协议的相关功能请求:support impersonating admin users for gSuite APIs (please note that this other FR,已经实现,指的是不同的功能)。

同时,我可以尝试在不使用库的情况下完成模拟过程。有关总体指南,请参阅 Preparing to make an authorized API call: HTTP/REST

参考: