Google云端硬盘范围drive.file不足以将应用拥有的文件复制到应用用户的Google云端硬盘

时间:2014-10-28 00:23:25

标签: google-drive-api

参与组件:

(所有在同一个项目中)

Android应用

网络应用

服务帐户

用户已使用Cross Client Identity在其Android设备上授权该应用: oauth2:server:client_id:[web_app_id] .apps.googleusercontent.com范围......

流速:

  1. 多个用户通过Android应用程序请求创建相同的文件(不希望每个用户都有一个文件,请参阅"已知的解决方法")
  2. 服务帐户随后会创建该文件(服务帐户为所有者)
  3. 服务帐户共享该文件(通过链接并明确指出用户)
  4. 冒充用户的用户授权的驱动器服务/或服务帐户尝试将该文件复制到用户的Google云端硬盘(用户必须最终成为该副本的所有者)
  5. 错误:

    这与范围drive.file(以及drive.readonly)失败: 错误信息: 经过身份验证的用户尚未授予对文件[file_id]

    的app [project_id]写入权限

    (顺便说一下:为什么copy()需要写访问?给用户写文件访问不会改变这个错误)

    已知的解决方法:

    适用于完整的驱动器范围 (:我的应用不需要查看尚未创建的文件 - 所以我想避免使用它)

    通过重新插入文件而不是复制文件也可以实现相同的结果 (这个开销对我的应用程序很重要,因为多个用户可能会请求相同的文件)

    与UI Picker中的文件进行显式交互将无法正常工作,因为在请求文件后必须创建该文件。在不降低Android应用程序可用性的情况下,我也无法想办法如何做到这一点。

    预期结果:

    www.googleapis.com/auth/drive.file :对应用创建或打开的文件的按文件访问权限

    在我看来,这应该足够了。 由我的应用程序的服务帐户创建/拥有/共享文件。 并由我的应用代表用户复制。

    www.googleapis.com/auth/drive.readonly 允许对文件元数据和文件内容进行只读访问

    至少这个应该工作,因为它应该给所有文件的读访问权限,这些文件应该足以复制"与用户共享"由"用户授权创建的文件"应用

    问题:

    Web应用程序和服务帐户位于同一个项目中。 Web应用程序是否可以代表用户充当服务帐户?如果是的话 - 我不知道怎么做。这会有所作为吗?

    在这个特殊用例中,这对我来说似乎是一个Bug,因为可以通过解决方法实现相同的结果。至少范围drive.readonly应该允许我的应用程序将应用程序拥有的文件复制到用户的驱动器。 通过普通的服务帐户制作副本,然后将该副本的所有者更改为用户将是另一种解决方法,但也会失败。

    我必须遗漏一些简单的东西。

    请指导我。

    谢谢。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并使用drive.metadata结合drive.file范围解决了这个问题。 Related question