1

我正在尝试做我认为简单的操作,但我在使用 Google API 时遇到了一些问题。我有两个 Google 凭据,一个来自服务帐户,一个来自已通过应用程序身份验证的用户的访问/刷新。

服务帐户具有域范围委派。

在服务帐户可以访问的团队驱动器(模板)上,我有一个文档,我想将其复制到用户的我的驱动器(根目录)。我通过以下方式获得文件夹的ID:

String userRootId = userCredential.drive().files().get( "root" ).setFields( "id" ).execute().getId();

它返回正确的标识符。当我使用服务帐户复制文件时,我可以整天在团队云端硬盘中进行复制。当我将它复制到用户的驱动器时,我得到“找不到文件:$userRootId”。

我假设这源于服务帐户无法访问用户的我的驱动器。我怎样才能使这个操作工作?有没有人尝试过这个?

4

1 回答 1

1

好的,所以我想出了一种适用于我的实现的方法。我有目标用户驱动器的访问/刷新令牌。如果你没有那个,我不确定你如何让它工作。步骤如下:

  1. 获取 SERVICE ACCOUNT 根,使用:

    String serviceRootId = this.serviceManager.drive().files().get( "root" ).setFields( "id" ).execute().getId();
    
  2. 使用服务帐号复制文件

    • 移除团队云端硬盘
    • 将父级设置为服务根 ID。这会将其从团队驱动器中删除,因此您实际上可以使用它做一些事情。
  3. 将文件共享给具有“作者”权限的用户(这消除了任何域问题)
  4. 现在,使用 USER'S 令牌,复制您刚刚共享的文件
  5. 删除服务帐户与用户共享的文件。

这一切似乎有点愚蠢,但我认为鉴于 Google Drive 的当前限制,这是唯一的方法。我本来希望允许具有域宽委派的服务帐户只复制该东西,但似乎没有。

如果有更好的方法,我很高兴学习,但现在这似乎可行。

于 2018-12-22T23:08:19.013 回答