基于表单(跨域)的Google Drive API上传与警告

时间:2012-10-02 21:48:08

标签: google-api cors google-drive-api

我目前正在开展一个相当有趣的项目。我有一个客户想要允许表单上传(从他们服务器上显示的页面)专门上传到他们自己的谷歌驱动器帐户。使用的平台基本上是LAMP。

单个(经过预先验证的)Google云端硬盘帐户。多个匿名上传源(用户)。

他们不希望用户拥有自己的Google帐户(只需在用户自己的驱动文件上使用Picker排除规则)。

他们想要一定程度的向后浏览器兼容性,例如IE8(排除XHR以使用HTML5的文件API来形成帖子以读取filedata)。由于某些移动浏览器可能存在兼容性问题,他们不想使用flash / etc。

工作原理:

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

问题:

  • REST API上传端点不支持CORS:无法直接访问结果iframe。 (见:Authorization of Google Drive using JavaScript
  • 成功上传的回报只是原始JSON,而不是JSONP。
  • 似乎没有办法在googleapis.com域上通过浏览器打开任何带有正确标题的内容,因此排除了easyXDM和类似的具有跨源解决方案通信javascript方法的多iframe。
  • 无法通过提交在POST中嵌入回调网址,API不允许这样做。
  • 如果您向其传递的Oauth2令牌不是针对在浏览器中也经过身份验证的用户(假设通过cookie),则Picker会在尝试上传时显示错误。奇怪的是,您可以显示来自Oauth2令牌的匹配帐户的文件,但除了在目标Oauth2令牌的帐户与已登录用户匹配的浏览器实例中,任何文件上载都会因模糊的“服务器被拒绝”消息而失败。这适用于所有文件和文件类型,包括在经过身份验证的浏览器实例中工作的文件。我认为这是某种认证流程/范围问题。我没有试过潜水Picker来源。
  • 所有javascript Google Drive API上传示例似乎都依赖于使用HTML 5来获取文件数据,因此似乎排除了任何这种性质。 在上传文件时,除了猜测哪个文件来自哪个用户之外别无他法,因为我们无法从我们无法访问的iframe中的结果中获取文件对象ID。最好的情况是我们可以根据猜测做出非常粗略的时间,但在并发问题的情况下,这是一个糟糕的想法。
  • 我们无法为文件设置文件名或任何其他标识符(甚至不是唯一文件夹),因为REST API依赖于通过邮政请求正文中的JSON发送的元数据,而不是通过表单字段。因此,我们最终在驱动器中没有名称等等的文件对象。
  • 我们无法使用元数据填充服务器端(或通过jquery / XHR或google javascript API客户端)创建文件,然后使用基于表单的上传进行更新,因为更新API端点专门用于PUT(已测试)
  • 我们无法将文件上传到我们的本地服务器,然后将它们发送到谷歌(代理它们),因为php ini被锁定以防止更大的文件上传(并回到对使用HTML5或闪存的限制,为什么我们不能块文件/等)。

所有这些都经过研究并在不同程度上进行了尝试。

目前这一点已经搁置(至少它是了解API并了解其局限性的一种有用方法)而且我只是想在Dropbox上实现类似的东西,但是如果有人有任何有用的话输入它会很可爱!

e.g。有没有办法让这个与驱动器一起使用?我忽略了什么吗?

我也意识到这可能基本上不是一个预期的用例,所以我不期待奇迹。我意识到理想的流程是简单地允许用户在必要时上传到他们自己的谷歌驱动器,然后让他们授予我们的网络应用程序的文件访问权限(通过Picker或API +我们自己的用户界面),但这不成为一个问题,当没有我们所有的用户都必须已经是Google帐户用户。我知道谷歌显然希望我们让更多的人与他们签约才能实现这一目标,但是让人们注册谷歌帐户以使用我们的应用程序被排除(不是出于任何偏见,这是太多的额外步骤和潜在的用户障碍)。即使只是让他们登录谷歌,如果他们确实有帐户被认为是基本的LCD功能功能不受欢迎,虽然它可能作为一个额外的选项添加在任何成为基础解决方案之上。

1 个答案:

答案 0 :(得分:1)

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

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