Я пытаюсь создать очень простое промежуточное программное обеспечение Basic Auth для Express на Node.js, как показано здесь: http://node -js.ru / 3-writing-express-middleware
У меня есть функция промежуточного программного обеспечения:
var basicAuth = function(request, response, next) {
if (request.headers.authorization && request.headers.authorization.search('Basic ') === 0) {
// Get the username and password
var requestHeader = new Buffer(
request.headers.authorization.split(' ')[1], 'base64').toString();
requestHeader = requestHeader.split(":");
var username = requestHeader[0];
var password = requestHeader[1];
// This is an async that queries the database for the correct credentials
authenticateUser(username, password, function(authenticated) {
if (authenticated) {
next();
} else {
response.send('Authentication required', 401);
}
});
} else {
response.send('Authentication required', 401);
}
};
И у меня есть мой маршрут:
app.get('/user/', basicAuth, function(request, response) {
response.writeHead(200);
response.end('Okay');
});
Если я попытаюсь свернуть этот запрос, я получу:
curl -X GET http://localhost/user/ --user user:password
Cannot GET /user/
Это прекрасно работает, когда я добавляю промежуточное ПО при вызове createServer (), но когда я делаю это для каждого запроса, как будто я нахожусь на этом маршруте, он просто тихо умирает на стороне сервера. К сожалению, поскольку не все запросы требуют аутентификации, я не могу сделать это глобальным промежуточным программным обеспечением.
Я попытался отключить Express и просто использовать Connect, и я получил тот же результат, поэтому я предполагаю, что это что-то есть. Кто-нибудь испытывал это раньше?
Редактировать: Я должен также упомянуть, что я зарегистрировал соответствующий код исчерпывающе, и вызывается следующий, но он, похоже, никуда не денется.
Редактировать 2: для записи, «пустое» промежуточное ПО также молча терпит неудачу:
var func = function(request, response, next) {
next();
};
app.get('/user', func, function(request, response) {
response.writeHead(200);
response.end('Okay');
});
Это также имеет тот же результат.