我正在尝试使用Express为未在本地主机上运行的客户端设置Node应用程序的身份验证。
基本上,我有一个运行Node的RPi,我使用Chromium作为设备的图形用户界面。问题是,你只需在网络上的任何浏览器上输入设备的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中的某些东西,或者我可以使用不同的授权中间件。
发布于 2018-06-13 03:12:58
我最终只使用了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));发布于 2018-06-09 07:19:17
尝试以下代码:
// Configuration
(req, res, next) => {
if(req.headers.host != 'localhost')
app.use({
users: { admin: 'secret' },
challenge: true
});
next();
}当本地主机尝试使用网站时,将“localhost”更改为任何req.headers.host状态。
basicAuth()中的三个点表示您拥有的所有剩余代码。next()用于告诉代码继续执行。
它有助于可视化每个访问后端的请求是否会通过设置文件“落入”。您添加到此文件中的每一项操作都像是请求失败的另一项操作。
发布于 2018-06-09 07:11:17
我认为最简单的解决方案是让web服务器在您的应用程序前面管理HTTP身份验证。然后,当您在本地时,您可以绕过when服务器,直接访问应用程序。
https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
否则,您将不得不编写代码来检查入站请求是否来自本地设备,可能是通过检查请求上的ip地址并将其与当前分配的ip地址进行比较来实现的。
https://stackoverflow.com/questions/50769382
复制相似问题