Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用express提供静态文件时无法使用基本身份验证_Node.js_Express_Basic Authentication - Fatal编程技术网

Node.js 使用express提供静态文件时无法使用基本身份验证

Node.js 使用express提供静态文件时无法使用基本身份验证,node.js,express,basic-authentication,Node.js,Express,Basic Authentication,使用用于node.js的Express framework,我试图提供目录中包含的静态文件,同时对其进行基本身份验证。当我这样做时,系统会提示我输入用户名和密码(正如预期的那样),但在我正确输入它们之后,会给我一个404。如果我删除身份验证检查并提供相同的目录,我实际上会得到其中包含的页面 以下是我作为概念证明而设计的快速服务器: var express = require('express'); var app = express(); var auth = express.basicAu

使用用于node.js的Express framework,我试图提供目录中包含的静态文件,同时对其进行基本身份验证。当我这样做时,系统会提示我输入用户名和密码(正如预期的那样),但在我正确输入它们之后,会给我一个404。如果我删除身份验证检查并提供相同的目录,我实际上会得到其中包含的页面

以下是我作为概念证明而设计的快速服务器:

var express = require('express');

var app = express();

var auth = express.basicAuth(function(user,pass) {
  return 'user' === user && 'pass' === pass;
});

app.use('/admin', auth, express.static(__dirname + '/admin'));
app.use('/adminNoAuth', express.static(__dirname + '/admin'));

app.listen(8082);
当我点击localhost:8082/admin时,我得到了用户名/密码,然后是404。当我点击
localhost:8082/adminNoAuth
时,它会弹出页面


我使用的是Express 3.4.7和node.js 0.10.22。

应用程序。使用
不会让你以这种方式连锁中间产品。各种
app.VERB
函数都有,但
app.use
没有。这是一次针对一个中间件

如果您将两个中间件拆分为单独的调用,您应该会得到想要的结果:

app.use('/admin', auth)
app.use('/admin', express.static(__dirname + '/admin'));
编辑

从express版本的
4.x
开始,您可以将多个中间件作为数组、参数或两者的混合传递到
应用程序中。使用
。现在,使静态文件授权安全将是:

app.use( "/admin", [ auth, express.static( __dirname + "/admin" ) ] );

但是这两种方法仍然是完全有效的。

我想我应该在这里发布Express4答案,因为对于这个特定的用例,没有其他的帖子标题像这个一样合适,而且它可能与更多的人相关

如果您使用的是express 4,那么很可能您使用的是服务索引、服务静态和http身份验证(除非有一种更简单的方法我没有提到):

注意,就我的测试而言,设置serveStatic时,我不需要通过“authMiddleware”。

答案:

var express = require("express")
var ss = require("serve-static")
var ba = require("basic-auth")
var app = express()
app.use("/", ss(__dirname + "/public"))
app.use(entry)
app.use("/privatesite", ss(__dirname + "/private"))
app.listen(4000)  

function entry(req, res, next) {
    var objUser = ba(req)
    if (objUser === undefined || objUser.name !== "john" || objUser.pass !== "1234") {
        res.set("WWW-Authenticate", "Basic realm=Authorization Required")
        res.status(401).end()
    } else { next() }
}

第一行app.use()向所有访问者提供x.x.x.x:4000(“/”路径)中“公共”文件夹的内容。第三行app.use()只向用户“john”提供了x.x.x.x:4000/privatesite(“/privatesite”路由)中“private”文件夹的内容,因为这一行写在加载身份验证中间件的第二行app.use()之后。该身份验证中间件使用“基本身份验证”组件,该组件返回一个对象,该对象的名称和密码由客户端编写。若不是“john”和“1234”,服务器返回401页;如果是,请继续(感谢next())到第三个应用。使用()行

我将分享它对我的作用

app.use("/login", (req, res, next) => {
  if (req.cookies.UUID) {
    res.redirect("/app");
  } else {
    next();
  }
});
app.use("/login", express.static("dist_auth_app"));
app.use("/app", (req, res, next) => {
  if (!req.cookies.UUID) {
    res.redirect("/login");
  } else {
    next();
  }
});
app.use("/app", express.static("dist"));

介意解释一下吗?第一行app.use()向所有访问者提供(“/”路径)中“public”文件夹的内容。第三个app.use()行仅向用户“john”提供(“/privatesite”路由)中“private”文件夹的内容,因为这一行写在加载身份验证中间件的第二个app.use()行之后。该身份验证中间件使用“基本身份验证”组件,该组件返回一个对象,该对象的名称和密码由客户端编写。若不是“john”和“1234”,服务器返回401页;如果是,请继续(感谢next())到第三个应用。使用()行使用此信息编辑您的答案。这将使它变得更好。正是我所需要的:)你不需要静态服务,express内置了这个
app.use("/login", (req, res, next) => {
  if (req.cookies.UUID) {
    res.redirect("/app");
  } else {
    next();
  }
});
app.use("/login", express.static("dist_auth_app"));
app.use("/app", (req, res, next) => {
  if (!req.cookies.UUID) {
    res.redirect("/login");
  } else {
    next();
  }
});
app.use("/app", express.static("dist"));