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 令牌

每个帐户或项目的Google Drive API限制?