为服务静态文件设置Express基本身份验证

5

我正在使用Express 4框架,需要基本身份验证来提供静态文件。这是我现在的代码:

app.use('/files', auth);
app.use('/files', express.static(path.join(__dirname, 'files')));

如果我尝试访问 /files,它能够很好地工作。但是,如果我写了 URL ../files/somefile.txt,身份验证就不需要了,我可以访问该文件。我希望 "files" 目录下的所有文件都只能被经过身份验证的用户访问。

4个回答

5

虽然这是一个旧帖子,但我刚遇到了同样的问题。我正在使用http-auth包来限制公共目录中文件夹的访问。

当请求受保护的目录时,中间件运行得很好(get /protectedFolder 显示身份验证提示),但是当直接请求文件时(get /protectedFolder/file.txt 显示file.txt的内容)它会跳过文件。

我通过改变中间件的顺序来解决了这个问题,我最初的顺序是

  app.use('/protected', express.static(path.join(__dirname, '../../../protected')));
  app.use('/protected', auth.connect(basic), (req, res, next) => {
      next();
  });

但正确的顺序应该是:
  app.use('/protected', auth.connect(basic), (req, res, next) => {
      next();
  });
  app.use('/protected', express.static(path.join(__dirname, '../../../protected')));

我希望这能对某些人有所帮助。


4
你尝试过以下方法吗: app.use('/files/*', auth); 其中,auth表示身份验证。

我听过的最好/最简单的答案之一。谢谢! - Nico Serrano

3
var basicAuth = require('basic-auth');
var auth = function(req, res, next){
    var user = basicAuth(req);
    if(user && user.name == "admin" && user.pass == "admin")
        return next();
    else{
        res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
        return res.send(401);
    }
}

app.use(function(req, res, next){
    if(req.url.indexOf('ftp') != -1){
        console.log(req.url);
        return auth(req, res, next);
    }
    else
        next();
});
app.use(express.static(path.join(__dirname, 'public')));
app.use('/ftp', serveIndex('public/ftp', {'icons': true, 'hidden': true, 'view': 'details'}))

这是我的代码,对我来说很好用,你可以试一下。


仍然是同样的问题,如果我直接访问/ftp/somefile.txt,则auth-middleware会被跳过。我也尝试了express 3,但它发生了同样的事情。如果somefile.txt不存在,这个方法可以正常工作并要求用户输入用户名和密码。但是,如果文件存在,我的浏览器将在没有身份验证的情况下打开它。 - otrec

2

app.use('/files', auth, express.static(path.join(__dirname, 'files')));

这段代码是一个使用Express框架的Node.js应用程序中的中间件。它告诉应用程序在URL路径'/files'下提供静态文件。同时,它还使用了一个名为"auth"的中间件来验证用户身份。最后,它使用了Node.js的内置模块"path"来指定要提供的文件夹的路径。

3
在Stack Overflow上,"如何"很重要,但该网站的许多优质内容是源于人们不遗余力地解释“为什么”。虽然“只有代码”的答案可以帮助提问者克服他们可能面临的障碍,但从长远来看,它对他们或未来的访问者帮助不大。请参阅“只有代码型答案是否有任何好处?”(英文) - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接