如何使用Express

时间:2015-07-22 21:12:18

标签: javascript node.js express authorization

我试图在Express上为整个网站添加基本授权。如果用户输入了正确的凭据,那么我希望显示标准登录页面。如果没有,那么用户应被带到"访问被拒绝"页。我试图找出如何改变basic-auth middleware示例来实现这一目标:

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

1 个答案:

答案 0 :(得分:1)

nextconnect的构造,它是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();
  }
}

了解Express在使用res.send(), res.json(), res.end(), res.redirect()发送响应后不会执行任何中间件非常重要。因此,在一种情况下(/具有错误的身份验证),ensureCredentials函数发送403并且app.get('/')处理程序不会被运行。在另一种情况下,auth签出,调用next(),并运行app.get('/')处理程序。