Похоже, реализация базовой HTTP-аутентификации в Express v3 была тривиальной:
app.use(express.basicAuth('username', 'password'));
Версия 4 (я использую 4.2) удалила basicAuth
промежуточное ПО, так что я немного застрял. У меня есть следующий код, но он не заставляет браузер запрашивать у пользователя учетные данные, что я бы хотел (и то, что, как мне кажется, делал старый метод):
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'});
res.end('Invalid credentials');
} else {
next();
}
});
Ответы:
Простая базовая аутентификация с ванильным JavaScript (ES6)
примечание: это «промежуточное ПО» можно использовать в любом обработчике. Просто удалите
next()
и переверните логику. См. Пример с одним утверждением ниже или историю редактирования этого ответа.Зачем?
req.headers.authorization
содержит значение "Basic <base64 string>
", но оно также может быть пустым, и мы не хотим, чтобы он завершился ошибкой, отсюда и странное сочетание|| ''
atob()
иbtoa()
, следовательно,Buffer
ES6 -> ES5
const
простоvar
.. вид(x, y) => {...}
толькоfunction(x, y) {...}
const [login, password] = ...split()
всего дваvar
задания в одномисточник вдохновения (использует пакеты)
Вышеупомянутый супер простой пример, который должен был быть очень коротким и быстро развертываемым на вашем игровом сервере. Но, как было указано в комментариях, пароли также могут содержать символы двоеточия
:
. Чтобы правильно извлечь его из b64auth , вы можете использовать это.Базовая авторизация в одном заявлении
... с другой стороны, если вы когда-либо используете только один или очень мало логинов, это необходимый минимум: (вам даже не нужно вообще анализировать учетные данные)
PS: нужен ли вам как «безопасный», так и «публичный» пути? Рассмотрите возможность использования
express.router
вместо этого.источник
.split(':')
потому что он подавится паролями, содержащими хотя бы одно двоеточие. Такие пароли действительны в соответствии с RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
для двоеточия.!==
для сравнения паролей делает вас уязвимыми для временных атак. en.wikipedia.org/wiki/Timing_attack убедитесь, что вы используете сравнение строк с постоянным временем.Buffer.from() // for strings
илиBuffer.alloc() // for numbers
asBuffer()
не рекомендуется из-за проблем с безопасностью.TL; DR:
☒
express.basicAuth
ушло☒
basic-auth-connect
устарело☒
basic-auth
не имеет никакой логики☒
http-auth
это перебор☑
express-basic-auth
это то, что вы хотитеБольше информации:
Поскольку вы используете Express, вы можете использовать
express-basic-auth
промежуточное программное обеспечение.См. Документы:
Пример:
источник
challenge: true
Многие промежуточные программы были извлечены из ядра Express в v4 и помещены в отдельные модули. Базовый модуль аутентификации находится здесь: https://github.com/expressjs/basic-auth-connect
Ваш пример просто нужно изменить на это:
источник
basic-auth
библиотекуЯ использовал код оригинала,
basicAuth
чтобы найти ответ:источник
Я изменил в экспресс 4.0 базовую аутентификацию с помощью http-auth , код:
источник
Кажется, для этого есть несколько модулей, некоторые из них устарели.
Этот выглядит активным:
https://github.com/jshttp/basic-auth
Вот пример использования:
Убедитесь, что вы поместили
auth
промежуточное ПО в правильное место, любое промежуточное ПО до этого не будет аутентифицировано.источник
implement
использовать протокол (он же отправить правильный заголовок)Мы можем реализовать базовую авторизацию без какого-либо модуля
Источник: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
источник
Express удалил эту функцию и теперь рекомендует использовать библиотеку basic-auth .
Вот пример того, как использовать:
Чтобы отправить запрос по этому маршруту, вам необходимо включить заголовок авторизации, отформатированный для базовой аутентификации.
Отправляя запрос curl сначала, вы должны принять кодировку base64
name:pass
или, в этом случае,aladdin:opensesame
которая равнаYWxhZGRpbjpvcGVuc2VzYW1l
Тогда ваш запрос на завиток будет выглядеть так:
источник
источник