Как защитить статическую папку в экспресс с паспортом
У меня есть проект на основе экспресс с требуемой аутентификацией на основе паспорта.
Backoffice - приложение angularjs, которое используется как статические файлы.
Мой код аутентификации полностью основан на https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js
Не использовать приложение angular, если вы не прошли аутентификацию. Я пытаюсь добавить makeAuthenticated по маршруту /admin, но он делает маршрут не работает (404). Как только я удалю makeAuthenticated/admin будет обслуживаться.
app.use(express.static(path.join(__dirname, 'public')));
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin')));
//serve routes
app.use(app.router);
Общая папка содержит страницу входа.
Как я мог достичь этого?
Ответы
Ответ 1
Вы можете проверить маршрут с помощью промежуточного программного обеспечения и перенаправить их, если они не вошли в систему и попадают на страницы администратора, что-то вроде (непроверено):
app.use(function(req, res, next) {
if (req.user == null && req.path.indexOf('/admin') === 0)
{
res.redirect('/login');
}
next();
});
Ответ 2
В то же самое время, это то, что я сделал!
app.use не позволяет вам перемещать middlewares таким образом. Различные Функции app.VERB делают, но app.use нет. Это для одного промежуточного программного обеспечения в то время.
Если вы разделите 2 middlewares на отдельные вызовы, вы должны получить результаты, которые вы хотите:
app.use('/admin', ensureAuthenticated);
app.use('/admin', express.static(path.join(__dirname, 'admin')));
Нельзя использовать базовую аутентификацию при показе статических файлов с помощью экспресс-доставки
Ответ 3
app.use('/admin', function(req,res,next){
if(req.user){
return express.static(path.join(__dirname, 'public'));
} else {
res.render(403, 'login', {message:'Please, login!'});
}
});
//serve routes
app.use(app.router);
Ответ 4
Обновление для [email protected]+
, [email protected]
и [email protected]
Сначала настройте стратегию аутентификации паспорта. Если вы используете jwt, вы можете взять токен из параметра запроса, если нет, вы можете использовать другую функцию Extract (или несколько, используя Jwt.ExtractJwt.fromExtractors()
).
passport.use('basic-user',
new Jwt.Strategy({
...jwtConfig.options,
jwtFromRequest: Jwt.ExtractJwt.fromUrlQueryParameter('token')
}, verifyUser)
);
Затем вы можете использовать функцию проверки подлинности паспорта перед обслуживанием статических файлов.
app.use('/files', [
passport.authenticate(['basic-user'], { session: false }),
express.static(path.join(__dirname, 'files')) //make sure you access proper directory
])