首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本HTTP身份验证,使用Express的Node的本地主机身份验证除外

基本HTTP身份验证,使用Express的Node的本地主机身份验证除外
EN

Stack Overflow用户
提问于 2018-06-09 07:01:48
回答 3查看 1.3K关注 0票数 0

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

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

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

代码语言:javascript
复制
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进行身份验证。

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

代码语言:javascript
复制
app.use( ( req ) =>
{
  debug( req.headers.host );
})

我对Node和Express的了解还不够多,无法把它们放在一起。

也许我遗漏了express-basic-auth中的某些东西,或者我可以使用不同的授权中间件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-13 03:12:58

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

代码语言:javascript
复制
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));
票数 1
EN

Stack Overflow用户

发布于 2018-06-09 07:19:17

尝试以下代码:

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

当本地主机尝试使用网站时,将“localhost”更改为任何req.headers.host状态。

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

它有助于可视化每个访问后端的请求是否会通过设置文件“落入”。您添加到此文件中的每一项操作都像是请求失败的另一项操作。

票数 0
EN

Stack Overflow用户

发布于 2018-06-09 07:11:17

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

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50769382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档