安全 RESTful API - 如何下载文件

Secured RESTful API - How to download a file

我正在用 Spring Boot 开发 RESTful API 并用 oAuth2.0 保护(通过 Spring Security),我的前端在 AngularJS .

我需要下载一个文件,我读到的每个 post 都说(我理解)我应该使用 window.open('urlToTheFileEndpoint');

但是那样做,我无法添加安全性 header(就像我所有其他 ajax 请求一样),因此 API 不允许完成我的请求。

有办法处理吗?或者我应该让这个文件端点不安全吗?

这个 SO 线程可能有用:

Download file with a REST request needing headers and giving the content

还提到这篇文章:

File Download with HTTP Request Header

这是一个片段:

var id = 123;
var req = ic.ajax.raw({
    type: 'GET',
    url: '/api/dowloads/'+id,
    beforeSend: function (request) {
        request.setRequestHeader('token', 'token for '+id);
    },
    processData: false
});

这就是我解决问题的方法:

当用户单击 "download" 时,我将对 API 服务器进行 ajax 调用,这不是 returns 文件,而是 returns临时 uuid。服务器将创建一个名为 uuid.route(即:abc-123.route)的临时文件,其中包含到该文件的真实路径(即:/mnt/data/files/excel_template.xlsx)。

然后当ajax用uuid调用returns时,我可以调用window.open('getFile?uuid=abc-123')。这将是一个不安全的端点。但一旦下载完成或在过期时间内,此路由文件将被删除,无法再次调用。

这样,它支持任何文件,任何大小。

这是我最好的方法。