Secure RESTful API - 如何下载文件



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

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

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

有没有办法解决这个问题?还是应该使此文件终结点不安全?

这个 SO 线程可能很有用:

下载带有需要标头并提供内容的 REST 请求的文件

它还提到了这篇文章:

使用 HTTP 请求标头下载文件

下面是一个片段:

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

这就是我将如何解决问题:

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

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

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

这是我最好的方法。

最新更新