除了使用Express的Node的localhost之外的基本HTTP身份验证

时间:2018-06-08 23:01:48

标签: node.js express basic-authentication

我正在尝试使用Express为未在localhost上运行的客户端设置Node应用程序的身份验证。

基本上,我有一个运行Node的RPi,我正在使用Chromium作为设备的GUI。问题是您只需从网络上的任何浏览器输入设备的IP地址,它就会提供相同的内容。在某些情况下这是需要的,但我想用密码保护它。

这是我使用express-basic-auth设置的设置:

const express = require('express'),
      basicAuth = require('express-basic-auth');

const app = module.exports = express();
const server = require('http').createServer(app);

// Hook Socket.io into Express
const io = require('socket.io').listen(server);

// Configuration
app.use( basicAuth(
{
  users: { admin: 'secret' },
  challenge: true
}))

app.use( express.static('./my_path/') );

// Socket.io Communication
io.sockets.on('connection', require('./modules/socket'));

// Start server
server.listen(3000, () => console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env));

但是,我不希望对localhost进行身份验证。

我可以从这样的请求中获取主持人:

app.use( ( req ) =>
{
  debug( req.headers.host );
})

我不太了解Node和Express将它们放在一起。

可能有express-basic-auth我缺少的东西或我可以使用的不同授权中间件。

3 个答案:

答案 0 :(得分:0)

请尝试以下代码:

// Configuration
(req, res, next) => {
  if(req.headers.host != 'localhost')
    app.use({
      users: { admin: 'secret' },
      challenge: true
    });
  next();
}

当localhost尝试使用该网站时,将“localhost”更改为req.headers.host状态。

basicAuth()中的三个点表示您拥有的所有其余代码。 next()用于告诉代码继续运行。

有助于可视化每个命中后端的请求是否“落入”设置文件。您添加到此文件中的所有内容都会像请求正在落实的其他内容一样运行。

答案 1 :(得分:0)

我最后只使用basic-auth并设置了WWW-Authenticate响应标头。

const express = require('express'),
      basicAuth = require('basic-auth');

const app = module.exports = express();
const server = require('http').createServer(app);

// Hook Socket.io into Express
const io = require('socket.io').listen(server);

// Configuration
app.use( ( req, res, next ) =>
{
  // Require authentication when the connection is not from localhost.
  if ( req.headers.host == 'localhost:3000' )
    return next();

  var authentication = basicAuth( req );

  if ( authentication && authentication.name == 'admin' && authentication.pass == 'secret' )
    return next();

  res.set('WWW-Authenticate', 'Basic');

  return res.status(401).send();
})

app.use( express.static('./my_path/') );

// Socket.io Communication
io.sockets.on('connection', require('./modules/socket'));

// Start server
server.listen(3000, () => console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env));

答案 2 :(得分:-1)

我认为最简单的解决方案是让应用程序前面的Web服务器管理HTTP身份验证。然后,当您在本地时,您可以绕过网络服务器并直接点击该应用程序。

https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/

否则,您将不得不编写代码来检查入站请求是否来自您的本地设备,可能是通过检查请求中的IP地址并将其与您当前分配的地址进行比较。