如何提供通过HTTP身份验证保护的文件下载

How to serve a download of a file which is protected via HTTP authentication

本文关键字:保护 文件下载 身份验证 HTTP 何提供      更新时间:2023-09-26

在服务器上,我有几个通过HTTP身份验证保护的文件。

现在我想在HTML页面上创建下载按钮来下载这些文件。我已经读到,由于安全原因,通过JavaScript/AJAX下载文件是不可能的。请看这个问题

此外,通过像这样的"正常"下载链接/按钮:<a href="..." download>是不可能设置HTTP报头来提供HTTP认证的。

是否有可能使下载按钮/链接到一个文件与HTTP基本认证。

此外,为了给出更多关于我的用例的细节,我不想使用会话。

您可以在url:

中尝试username:password语法。
<a href="username:password@example.com/file.zip">Download</a>

但是,请注意浏览器制造商出于安全原因已经开始取消对此的支持。IE和Chrome不再支持。

解决方案

作为一种变通方法,您可以在服务器上发出请求,而不是直接从浏览器中的HTML发出请求。只需编写一个简单的脚本,接受请求并获取受密码保护的文件。

下面是一个使用expressrequest的简单node.js示例:

var express = require('express');
var request = require('request');
var app = express();
app.get('remote-file',function(req,res){
    request.get('username:password@example.com/file.zip').pipe(res);
});
app.listen(80);

请求模块支持username:password语法

我有同样的问题,唯一的区别是我使用JWT进行身份验证。

但是这个原则仍然适用。你说你不想使用会话,所以这让我认为你可以访问后端。

你能做的就是用auth保护路由(/generate-token)。在这里,您将创建一个令牌以及它的创建时间和所请求的文件。然后,您将有另一个路由(/download-file/{token}),在那里您将根据提供的令牌执行实际的下载。请注意,第二条路由不是auth保护的。

令牌可以一次使用,并且只能在有限的几分钟内可用,以提高安全性。

通过实现这种方法,您将额外需要数据库中的一个表,可能还需要一个cron来定期删除未使用和过期的令牌。