2015-07-22 3 views
1

Я пытаюсь добавить основную авторизацию на весь сайт в Express. Если пользователь вводит правильные учетные данные, я бы хотел, чтобы стандартная целевая страница отображалась. Если нет, то пользователь должен быть доведен до страницы «отказано в доступе». Я пытаюсь выяснить, как изменить basic-auth middleware пример для достижения этой цели:Как направить целевую страницу по умолчанию с базовым-auth-промежуточным программным обеспечением в Express

var http = require('http') 
var auth = require('basic-auth') 

// Create server 
    var server = http.createServer(function (req, res) { 
    var credentials = auth(req) 

    if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') { 
    res.statusCode = 401 
    res.setHeader('WWW-Authenticate', 'Basic realm="example"') 
    res.end('Access denied') 
    } else { 
    res.end('Access granted') 
    } 
}) 

Если я использую next(); вместо res.end(), я получаю сообщение об ошибке undefined.

var server = http.createServer(function (req, res, next) { 
    var credentials = auth(req) 

    if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') { 
    res.statusCode = 401 
    res.setHeader('WWW-Authenticate', 'Basic realm="example"') 
    res.end('Access denied') 
    } else { 
    next(); 
    } 
}) 

Это то, что мои маршруты выглядеть следующим образом:

app.use('/api/things', require('./api/thing')); 

    // . . . 

    // All other routes should redirect to the index.html 
    app.route('/*') 
.get(function(req, res) { 
    res.sendFile(path.resolve(app.get('appPath') + '/index.html')); 
}); 

ответ

1

next является строительство connect который является библиотека промежуточного слоя, лежащей в основе веб-сервера Express. Но вы передаете свою собственную функцию обработчика на http-сервер. Вы должны заставить http-сервер использовать экспресс-приложение для обработки запросов. Затем промежуточное программное обеспечение Express упрощает его.

var http = require('http'); 
var auth = require('basic-auth'); 
var app = require('express')(); 
var server = http.Server(app); 
server.listen(3000); 

app.get('/', ensureCredentials, function(req, res){ 
    res.sendFile(path.resolve(app.get('appPath') + '/index.html')); 
}) 
app.all('*', function(req, res){ 
    res.redirect('/'); 
}) 
function ensureCredentials(req, res, next){ 
    // do logic 
    if(){ 
    res.status(403).send('Unauthorized') 
    } else { 
    next(); 
    } 
} 

Ее важен понять, что экспресс не выполняет какие-либо после того, как промежуточное программный ответ отправляется с res.send(), res.json(), res.end(), res.redirect(). Поэтому в одной ситуации (/ с плохим auth) функция ensureCredentials отправляет 403, а обработчик app.get('/') не будет запущен. В другой ситуации, auth проверяет, вызывается next(), и выполняется обработчик app.get('/').

+0

спасибо. По какой-то причине, когда я использую код выше, я не получаю приглашение имени пользователя и пароля. Страница загружается, как обычно. Какие-либо предложения? – Ken

+0

Возможно, это то, для чего нужны заголовки ... может быть, вы всегда терпите неудачу при первой попытке и используете заголовок, чтобы сообщить браузеру «показать подсказку». Попробуйте настроить заголовки в ответе 'securityCredentials' 403. Кроме того, если вы не знали, что можете вручную передавать учетные данные в запросе с помощью 'https: // user: password @ domain.com /' – Plato

+0

О, ну, страница загружается каждый раз, потому что я пропустил всю логику auth. вам нужно положить что-то на страницу 'if() {' ... – Plato

Смежные вопросы