【发布时间】:2014-12-23 07:22:44
【问题描述】:
参与组件:
(都在同一个项目中)
Android 应用
网络应用
服务帐号
用户已在其 Android 设备上使用Cross Client Identity 授权该应用: oauth2:server:client_id:[web_app_id].apps.googleusercontent.com 范围 ...
流程:
- 多个用户请求通过 Android 应用创建同一个文件(不需要为每个用户创建一个文件,请参阅“已知解决方法”)
- 然后服务帐户创建该文件(服务帐户是所有者)
- 服务帐户共享该文件(通过链接并与用户明确)
- 用户授权的云端硬盘服务/或模拟用户的服务帐户尝试将该文件复制到用户的 Google 云端硬盘(最终用户必须是该副本的所有者)
错误:
这会因范围 drive.file (以及 drive.readonly )而失败: 错误信息: 经过身份验证的用户尚未授予应用程序 [project_id] 对文件 [file_id] 的写入权限
(顺便说一句:为什么 copy() 需要写入权限?授予用户对文件的写入权限不会改变此错误)
已知的解决方法:
它适用于全驱动范围 (但是:我的应用不需要查看它没有创建的文件 - 所以我想避免它)
同样的结果也可以通过重新插入文件而不是复制文件来实现 (不过,这个开销对我的应用很重要,因为多个用户可能会请求同一个文件)
与来自 UI Picker 的文件的显式交互可能无法正常工作,因为必须在请求文件后创建文件。我也想不出如何在不降低 Android 应用可用性的情况下做到这一点。
预期结果:
www.googleapis.com/auth/drive.file:按文件访问由应用创建或打开的文件
在我看来这应该足够了。 由于该文件由我的应用程序的服务帐户创建/拥有/共享。 并由我的应用代表用户复制。
www.googleapis.com/auth/drive.readonly 允许对文件元数据和文件内容进行只读访问
至少这个应该可以工作,因为它应该授予对所有文件的读取权限,这些文件应该足以复制由“用户授权”应用创建的“与用户共享”文件。
问题:
Web 应用程序和服务帐户在同一个项目中。 Web 应用程序可以代表用户充当服务帐户吗?如果是这样 - 我不知道怎么做。无论如何,这会有所不同吗?
在这个特殊用例中,这对我来说似乎是一个错误,因为可以通过解决方法来实现相同的结果。至少范围 drive.readonly 应该允许我的应用程序将应用程序拥有的文件复制到用户的驱动器。 通过普通服务帐户制作副本,然后将该副本的所有者更改为用户将是另一种解决方法,但这也失败了。
我一定错过了一些简单的东西。
请指导我。
谢谢。
【问题讨论】:
标签: google-drive-api