【问题标题】:How to get starred files using the Google Drive Api and a service account?如何使用 Google Drive Api 和服务帐户获取已加星标的文件?
【发布时间】:2021-02-01 19:34:47
【问题描述】:

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

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

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

代表 Google 以外的服务帐户访问私人数据 云环境

建议:服务帐号密钥

这是预期的工作流程:

  1. 管理员创建了一个 Drive 文件夹,该文件夹与选定的用户和服务帐户共享。
  2. 用户可以在该共享文件夹中创建文件。
  3. 管理员可以为这些文件的选择加注星标并调用应用程序。
  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 是一个空列表;没有加星标的文件。

我怀疑这与使用服务帐户有关,并且可能有一种方法可以通过以某种方式模拟某些东西来解决这个问题,但是文档很深入,我不确定它是否会有所帮助出去。

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

【问题讨论】:

  • 我也有同样的情况。我认为这是一个错误或服务帐户的当前规范。因为例如files(name,starred) 用于fields 时,即使文件夹中存在带有星号的文件,对于所有文件,starred 的字段始终为false。我认为这是您的问题的原因。所以在当前阶段,很遗憾,无法使用服务帐户直接检索已加星标的文件列表。例如,如何将其作为未来的请求报告给 Google 问题跟踪器?
  • @Tanaike。谢谢,我提出了一个问题,请随时给它加星标:issuetracker.google.com/issues/179060625
  • 感谢您的回复。现在,通过包含更多信息,我提出了实现目标的解决方法。你能确认一下吗?顺便说一句,我确认了您的问题跟踪器。所以我给它加了星。作为问题跟踪器的附加信息,添加以下信息怎么样?当使用服务帐户并将files(name,starred) 用于fields 时,即使文件夹中存在带星号的文件,starred 的字段对于所有文件始终为false。这可能是问题的原因。
  • 我认为这不是 Google 方面的问题。由服务帐户加星标的文件可以通过Files: list 返回。至少这是我正在经历的行为。

标签: go google-drive-api


【解决方案1】:

从你的问题,我了解到你现在的情况如下。

  • 您想从特定文件夹中检索带有星号的文件的文件列表。
  • 该文件夹在您的帐户和服务帐户之间共享,您可以在 Google 云端硬盘中看到已加星标的文件。
  • 您希望使用 googlapis for golang 来实现此目的。

我也有同样的情况。我认为这是一个错误或服务帐户的当前规范。

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

所以在当前阶段,我认为很遗憾,无法使用服务帐户直接检索已加星标的文件列表。当您要检索已加星标的文件列表时,以下变通方法如何?

解决方法 1:

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

解决方法 2:

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

注意:

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

参考资料:

【讨论】:

  • 非常感谢您的详细回答。您是否专门考虑过以下针对 Go 的@Iamblichus 解决方案?从很多问题阅读中,我怀疑无法使用 Go 完成冒充管理员的服务帐户?
  • 这肯定不是问题,因为服务帐户肯定可以找到由它加星标的文件。只是,在这种情况下,文件不是由服务帐户加星标,而是由普通用户加星标。
  • @Iamblichus 感谢您的评论。现在我注意到你已经发布了你的答案。我为此道歉。尽管当我发布此答案时,我不确定这种情况是错误还是当前规范,但从您的评论和回答中,我可以知道这是规范。感谢您一直以来的支持。
【解决方案2】:

问题:

文件本身没有星号。文件为特定用户加星标,如您所见here

已加星标:用户是否已为文件加星标。

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

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

解决办法:

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

如果您想避免域范围的委派,解决方法 #2 provided by Tanaike 也可能是一个不错的选择。

更新:

您正在使用 Go,不幸的是,相应的 API 库尚不包含使用服务帐户模拟域用户的功能。以下是来自库 repo 的相关功能请求:support impersonating admin users for gSuite APIs(请注意,已经实现的this other FR 指的是不同的功能)。

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

参考:

【讨论】:

  • 您引用的文档部分以“当您准备进行授权的 API 调用时,您指定要模拟的用户”结尾。问题是,我看不到使用 Go Drive API V3 客户端执行此操作的任何方法?
  • @DavidSmith 我认为 Go 库仍然无法使用此功能。以下是相关功能请求:support impersonating admin users for gSuite APIs(请注意,已经实现的this other FR 指的是不同的功能 - 模拟另一个服务帐户)。
  • @DavidSmith 同时,我认为你应该不用图书馆。有关整体指南,请参阅 Preparing to make an authorized API call: HTTP/REST
  • @DavidSmith 我更新了答案以添加此信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2019-12-12
  • 2019-03-07
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多