安全的RESTful API - 如何下载文件

时间:2017-01-13 21:27:58

标签: angularjs ajax file download restful-architecture

我正在使用Spring Boot开发一个RESTful API,并使用oAuth2.0(通过Spring Security)和我在AngularJS的前端进行保护。

我需要下载一个文件,我读过的每个帖子都说(我明白)我应该使用window.open('urlToTheFileEndpoint');

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

有办法解决这个问题吗?或者我应该使此文件端点不安全吗?

2 个答案:

答案 0 :(得分:1)

这个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
});

答案 1 :(得分:1)

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

当用户点击“下载”时,我会对API服务器进行ajax调用,该服务器不返回文件,但返回临时uuid.route。服务器将创建一个名为window.open('getFile?uuid=abc-123')的临时文件(即:abc-123.route),其中包含文件的实际路径(即:/mnt/data/files/excel_template.xlsx)。

然后当ajax调用使用uuid返回时,我可以调用{{1}}。这将是一个不安全的端点。但是一旦下载或在到期时间内,该路由文件将被删除,因此永远不会再被调用。

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

这是我最好的方法。