javascript - Onedrive cors 在 javascript 中下载

标签 javascript redirect download cors onedrive

我正在尝试在客户端 javascript 中处理 onedrive 文件,但首先我需要一种使用 XMLHttpRequest 来下载文件的方法。 onedrive支持cors的很多操作,但是下载文件到javascript有如下问题:

如此处所述:onedrive rest api manual

我可以发送请求到:

获取 https://apis.live.net/v5.0/FILE_ID/content?access_token=ACCESS_TOKEN

它会回复一个位置 header ,将浏览器重定向到文件。问题是当我通过 XHR 发送这些请求时,浏览器总是随请求发送 Origin header 。对于我上面描述的第一个请求,onedrive 还回复了一个 Access-Control-Allow-Origin:* header ,因此该请求在浏览器中被允许。然而,当浏览器被重定向到文件的实际位置时,该资源没有 Access-Control-Allow-Origin header ,因此 XHR 请求被浏览器拒绝(chrome 发送一个 Origin header 设置为 null重定向请求)。

我也试过获取位置但不自动重定向,然后发送另一个 XHR 请求,这会将原始 header 设置为我网站的域,但结果是一样的。

正如我在开头提到的,我需要在 javascript 中处理数据,所以我不是在问如何将 onedrive 文件下载到硬盘。我需要网页中的 javascript 可以访问数据。

我知道我可以使用服务器端编程为我获取文件数据,然后将其发送给客户端,但对于我的应用程序,这不是一个选项(至少这不是我在时刻)。

如果没有办法做到这一点,有没有人知道为什么他们会以这种方式实现他们的 api?允许 javascript 通过 cors 和重定向获取位置,但不包含重定向资源的 cors header 。为什么不首先拒绝 cors 呢?这是错误吗?

最佳答案

据我所知,答案是下载内容不能仅通过浏览器中的 JavaScript 完成。他们为什么这样做?你必须问他们,但我猜要么是一个错误,要么是一些未指明的“安全问题”。就其值(value)而言,他们似乎认为下载内容 符合此处文档中的 CORS:https://dev.onedrive.com/misc/working-with-cors.htm :

To download files from OneDrive in a JavaScript app you cannot use the /content API, since this responds with a 302 redirect. A 302 redirect is explicitly prohibited when a CORS preflight is required, such as when providing the Authorization header.

Instead, your app needs to select the @content.downloadUrl property, which returns the same URL that /content would have redirected to. This URL can then be requested directly using XMLHttpRequest. Because these URLs are pre-authenticated they can be retrieved without a CORS preflight request.

然而,据我所知,他们是错误的。仅仅因为您不需要预检请求并不意味着响应符合 CORS。您仍然需要在响应中使用 Access-Control-Allow-Origin header 。

对于任何想知道的人,这仍然是新图形 API 中的一个问题(据我所知,它本质上是 OneDrive API 的代理 API)。相同的基本问题仍然存在 - 您可以从项目中获取下载 URL,但该 URL 指向不符合 CORS 的资源,因此这对您没有多大好处。

我有一个 Unresolved Microsoft 问题 here关于这个问题。我的问题得到了一些回应(我让他们通过图形 API 公开了下载 URL),但我仍在等待,看看他们是否会想出一个真正的解决方案来从 JavaScript 下载内容。

如果我在那个问题上得到了解决方案或真正的答案,我会尝试在这里报告,以便将来其他人可以有真正的答案供引用。

关于javascript - Onedrive cors 在 javascript 中下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27068647/

相关文章:

Java - 文件下载使程序停止

javascript - 为什么 Date.parse 给出不正确的结果?

android - 为什么 "appAuthRedirectScheme"作为 list 占位符无效?

php - 没有 URL 重写的元刷新

unity3d - 不允许重定向 url localhost 和 127.0.0.1 时如何在 Unity 中从 Sign in with Apple 获取代码

java - Android:应用程序重新启动时下载的文件被删除

javascript - 在不关闭 websockets 的情况下更改 Firefox 中的 window.location.href

javascript - 按下按钮时如何使 JavaScript 工作?

javascript - D3 数据映射 : OnClick Events on Bubbles Passing in Attributes of Bubble

javascript - 使用 HTML Canvas 创建一个类似 div 的元素,将溢出设置为自动