Как защитить статическую папку в экспресс с паспортом

У меня есть проект на основе экспресс с требуемой аутентификацией на основе паспорта.

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
])