Google Drive 范围 drive.file 不足以将应用拥有的文件复制到应用用户的 Google Drive
Posted
技术标签:
【中文标题】Google Drive 范围 drive.file 不足以将应用拥有的文件复制到应用用户的 Google Drive【英文标题】:Google Drive scope drive.file not sufficient for copying app owned files to app user's Google Drive 【发布时间】: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 应该允许我的应用程序将应用程序拥有的文件复制到用户的驱动器。 通过普通服务帐户制作副本,然后将该副本的所有者更改为用户将是另一种解决方法,但这也失败了。
我一定错过了一些简单的东西。
请指导我。
谢谢。
【问题讨论】:
【参考方案1】:我遇到了同样的问题,并结合使用 drive.metadata 和 drive.file 范围解决了它。 Related question
【讨论】:
以上是关于Google Drive 范围 drive.file 不足以将应用拥有的文件复制到应用用户的 Google Drive的主要内容,如果未能解决你的问题,请参考以下文章
将两个数据范围合并为一个范围(Google Drive Excel)
BigQuery AppsScript 客户端的默认范围不包括 Google Drive
bigQuery Google Drive 使用 googleSheetsOptions 范围查询多张工作表
Drive API v3 的 Google Oauth2 范围请求不起作用
尝试从 golang 广告读取/运行对 bigquery 的查询被拒绝访问:BigQuery BigQuery:未找到具有 Google Drive 范围的 OAuth 令牌