Обычная HTTP-аутентификация, за исключением локального хоста с Node, использующим Express - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь настроить аутентификацию для приложения Node с помощью Express для клиентов, которые не работают на localhost.

В основном у меня есть RPi, на котором работает Node, и я использую 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, которое мне не хватает, или другое промежуточное ПО авторизации, которое я могу использовать.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Попробуйте следующий код:

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

Измените 'localhost' на любое состояние req.headers.host, когда localhost пытается использовать веб-сайт.

Тройные точки в basicAuth() представляет весь остальной код, который у вас есть.next () используется, чтобы сообщить коду продолжать работу.

Это помогает визуализировать, «падает» ли каждый запрос, попадающий в бэкэнд, в установочный файл.Каждая вещь, которую вы добавляете в этот файл, работает как другая вещь, через которую проваливается запрос.

0 голосов
/ 12 июня 2018

Я просто использовал 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));
0 голосов
/ 09 июня 2018

Я думаю, что самым простым решением было бы иметь веб-сервер перед вашим приложением для управления HTTP-аутентификацией.Затем, когда вы находитесь локально, вы можете обойти веб-сервер и напрямую нажать на приложение.

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

В противном случае вам придется написать код, чтобы проверить, поступает ли входящий запрос от вашего локальногоустройство или нет, возможно, проверив IP-адрес в запросе и сравнив его с назначенным на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...