Google api 基于表单(跨域)的Google Drive API上载,附带注意事项

Google api 基于表单(跨域)的Google Drive API上载,附带注意事项,google-api,cors,google-drive-api,Google Api,Cors,Google Drive Api,我现在正在做一个非常有趣的。。。项目我有一个客户希望允许表单上传(从他们服务器上的页面)到他们自己的google drive帐户。所使用的平台基本上是灯 单一(预认证)谷歌驱动器帐户。多个匿名上传源(用户) 他们不希望用户被要求拥有自己的google帐户(排除在用户自己的驱动器文件上使用Picker) 他们需要某种程度的向后浏览器兼容性,比如IE8(排除了使用HTML5的文件API来读取文件数据的XHR来形成post)。由于与某些移动浏览器存在潜在的兼容性问题,他们不想使用flash/etc 工

我现在正在做一个非常有趣的。。。项目我有一个客户希望允许表单上传(从他们服务器上的页面)到他们自己的google drive帐户。所使用的平台基本上是灯

单一(预认证)谷歌驱动器帐户。多个匿名上传源(用户)

他们不希望用户被要求拥有自己的google帐户(排除在用户自己的驱动器文件上使用Picker)

他们需要某种程度的向后浏览器兼容性,比如IE8(排除了使用HTML5的文件API来读取文件数据的XHR来形成post)。由于与某些移动浏览器存在潜在的兼容性问题,他们不想使用flash/etc

工作原理:

  • 身份验证(获取刷新令牌,存储,根据需要使用它获取访问令牌)
  • 将没有元数据的文件上载到帐户
  • 文件上载发送到隐藏iframe的结果
  • 通过jquery捕获iframe加载事件,至少知道发生了什么
问题:

  • REST API上载端点不支持CORS:无法直接访问结果iframe。(见:)
  • 成功上传返回的只是原始JSON,而不是JSONP
  • 在googleapis.com域上,似乎没有办法通过浏览器打开任何具有适当标题的内容,因此排除了使用跨源工作区通信javascript方法的类似多iframe
  • 无法从submit在帖子中嵌入回调URL,API不允许这样做
  • 如果您向其传递的Oauth2令牌不适用于在浏览器中也经过身份验证的用户(假定通过cookie),则选择器在尝试上载时会显示错误。奇怪的是,您可以显示来自Oauth2令牌的匹配帐户的文件,但除了在浏览器实例中目标Oauth2令牌的帐户与已登录用户匹配之外,任何文件上载都会失败,并显示一条含糊不清的“服务器拒绝”消息。所有文件和文件类型都会发生这种情况,包括在经过身份验证的浏览器实例中工作的文件。我假设这是某种身份验证流/范围问题。我还没试过潜水去寻找信号源
  • 所有的JavaScriptGoogleDriveAPI上传示例似乎都依赖于使用HTML5来获取文件数据,因此任何这种性质的内容都被排除在外。 上载文件时,除了猜测哪个文件来自哪个用户之外,没有其他方法,因为我们无法从无法访问的iframe中的结果中获取文件对象ID。充其量,我们可以做出一个非常粗略的基于时间的猜测,但在并发问题的情况下,这是一个糟糕的想法
  • 我们不能为文件设置文件名或任何其他标识符(甚至不是唯一的文件夹),因为RESTAPI依赖于通过post请求主体中的JSON发送的元数据,而不是通过表单字段发送的元数据。因此,驱动器中的文件对象没有名称/etc
  • 我们不能在服务器端(或通过jquery/XHR或googlejavascript-API客户端)创建元数据填充的文件,然后使用基于表单的上传来更新它,因为更新API端点只与PUT(tested)一起工作
  • 我们无法将文件上传到本地服务器,然后将其发送到谷歌(代理),因为php ini已被锁定,以防止更大的文件上传(并返回到使用HTML5或flash的限制,以解释为什么我们无法分块文件/etc)
所有这些都经过了研究,并在不同程度上进行了尝试

目前,这是一个暂停(至少这是一个学习API并了解其局限性的有用方法),我只是想在dropbox上实现类似的东西,但如果有人有任何有用的输入,那就太好了

e、 g.有没有办法让这个硬盘工作?我忽略了什么吗


我也意识到这可能本质上是一个低于预期的用例,所以我并不期待奇迹出现。我意识到理想的流程是允许用户在必要时上传到他们自己的谷歌硬盘,然后让他们授权文件访问我们的web应用(通过Picker或API+我们自己的UI),但当我们自己的用户不一定都已经是谷歌账户用户时,这就成了一个问题。我知道谷歌显然更愿意让更多的人注册,以实现这一目标,但让人们注册谷歌账户使用我们的应用程序是不可能的(这不是出于我们的偏见,只是增加了太多步骤和潜在的用户障碍)。即使只是让他们在有账户的情况下登录谷歌,对于基本的LCD功能来说也被认为是不必要的,尽管它可能会作为一个附加选项添加到基础解决方案之上。

您所描述的方法的最大问题是您引入了一个大的安全问题。允许匿名用户直接从客户端上传到驱动器需要将共享访问令牌泄漏给任何路过的人。即使在有限的drive.file范围内,恶意用户甚至有点好奇的用户也可以列出、访问(读取/更新/删除!)该应用程序上载的任何文件


当然,公共投递箱功能仍然有用,但您确实需要代理这些请求以避免暴露访问令牌。如果您的PHP环境限制太多,为什么不在别处运行代理呢?您可以在任何地方托管一个简单的代理来处理上传操作——app engine、heroku等,并支持您需要的任何功能,以确保为您的应用正确设置元数据。

感谢您分享您的作业。我一直在尝试实现类似的功能,但遇到了一些相同的问题。看起来google drive可能不是应用程序存储服务的最佳解决方案