如何在Express中使用basic-auth中间件指向默认login页面

我正在尝试向Express上的整个站点添加基本授权。 如果用户input正确的凭据,那么我希望显示标准login页面。 如果没有,那么用户应该被带到“访问被拒绝”页面。 我想弄清楚如何改变基本authentication中间件的例子来完成这个:

var http = require('http') var auth = require('basic-auth') // Create server var server = http.createServer(function (req, res) { var credentials = auth(req) if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') { res.statusCode = 401 res.setHeader('WWW-Authenticate', 'Basic realm="example"') res.end('Access denied') } else { res.end('Access granted') } }) 

如果我使用next(); 而不是res.end() ,我得到一个undefined错误。

  var server = http.createServer(function (req, res, next) { var credentials = auth(req) if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') { res.statusCode = 401 res.setHeader('WWW-Authenticate', 'Basic realm="example"') res.end('Access denied') } else { next(); } }) 

这是我的路线看起来像:

 app.use('/api/things', require('./api/thing')); // . . . // All other routes should redirect to the index.html app.route('/*') .get(function(req, res) { res.sendFile(path.resolve(app.get('appPath') + '/index.html')); }); 

next是一个connect的结构,它是Express Web服务器下的一个中间件库。 但是你将自己的处理函数传递给http服务器。 您应该使http服务器使用快速应用程序来处理请求。 然后快递的中间件使其变得简单。

 var http = require('http'); var auth = require('basic-auth'); var app = require('express')(); var server = http.Server(app); server.listen(3000); app.get('/', ensureCredentials, function(req, res){ res.sendFile(path.resolve(app.get('appPath') + '/index.html')); }) app.all('*', function(req, res){ res.redirect('/'); }) function ensureCredentials(req, res, next){ // do logic if(){ res.status(403).send('Unauthorized') } else { next(); } } 

使用res.send(), res.json(), res.end(), res.redirect()发送响应之后,需要了解Express不执行任何中间件。 因此,在一种情况下( /使用不正确的身份validation), ensureCredentials函数发送一个403,并且app.get('/')处理程序将不会运行。 在另一种情况下,auth检出, next()被调用,并运行app.get('/')处理程序。