javascript - 如何使用 Express 中的 basic-auth 中间件定向到默认登陆页面

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

最佳答案

nextconnect 的构造,它是 Express Web 服务器底层的中间件库。但是您将自己的处理函数传递给 http 服务器。您应该让http服务器使用express应用程序来处理请求。那么express的中间件让一切变得简单。

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 不会执行任何中间件。因此,在一种情况下(/ 身份验证错误),ensureCredentials 函数会发送 403,并且 app.get('/') 处理程序将不会运行。在另一种情况下,身份验证检查完毕,调用 next(),并运行 app.get('/') 处理程序。

关于javascript - 如何使用 Express 中的 basic-auth 中间件定向到默认登陆页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574070/

相关文章:

php - 将来自 JSON 的数据放入 MySQL 数据库

node.js - 将请求传递给特定的 fork Node 实例

javascript - 在 express 之外的脚本中从 express 应用程序导入模块时出现问题

node.js - Ejs input_field_tag方法设置type属性为5

javascript - 在数组中查找字符串

javascript - 在 getStaticProps 函数中序列化 Next.js 时出错?

javascript - 使用指令设置默认变量

javascript - NodeJS Module.Exports 对象原型(prototype)问题

javascript - 在没有摩卡超时的情况下测试 socket.on ('data' ) 回调

node.js - express.js 请求事件是否记录在任何地方?