Сессия экспресс-установки для определенных маршрутов

Я пытаюсь включить сеансы только для некоторых маршрутов (аутентификационных), но у меня проблема из-за маршрутов страницы ошибок:

У меня есть это:

    app.use(session({
        secret: config.secrets.session,
        saveUninitialized: false,
        resave: false,
        store: sessionStore,
        proxy: true,
        cookie: {
            maxAge: config.token_duration,
            secure: false
        }
        // rolling: false
    }));


    app.use('/api/user', require('./api/user'));
    app.use('/api/auth', require('./api/auth'));  

    app.route(['/error/500','/error/404','/user/settings'])
        .get((req, res) => {
            res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
        });

    app.route('/*/*')
        .get(errors[404]);       

    app.use(errors[500]); 

Итак, если я использую это так, все страницы в моем приложении создадут сеанс (чего я не хочу). Если я перемещу раздел сеанса после маршрутов ошибок, я никогда не доберусь до маршрутов API, потому что он достигнет маршрута 404.

заранее спасибо


person Bernardo    schedule 08.02.2017    source источник


Ответы (2)


Промежуточное ПО может быть связано только с определенными маршрутами, и порядок его указания имеет значение. Есть несколько способов сделать это, и то, как лучше всего реализовать это, зависит от путей, которые использует ваш сайт, и от того, как вы можете наиболее легко создать связь между путем и тем, должно ли оно иметь промежуточное программное обеспечение сеанса.

Одна простая вещь — поместить обработчики маршрутов ошибок ПЕРЕД промежуточным программным обеспечением сеанса. Затем эти обработчики маршрутов будут сначала «обрабатывать» запрос, и промежуточное программное обеспечение сеанса никогда не будет вызываться.

app.route(['/error/500','/error/404','/user/settings'])
    .get((req, res) => {
        res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
    });

app.use(session({
    secret: config.secrets.session,
    saveUninitialized: false,
    resave: false,
    store: sessionStore,
    proxy: true,
    cookie: {
        maxAge: config.token_duration,
        secure: false
    }
    // rolling: false
}));

Другие вещи, которые вы можете сделать:

  1. Укажите путь к промежуточному программному обеспечению сеанса, чтобы оно вызывалось только для определенных путей на вашем сайте (все аутентифицированные страницы должны быть ниже этого пути).

  2. Создайте свой собственный обработчик промежуточного программного обеспечения, который проверяет, является ли путь /error, и если нет, то он вызывает обработчик промежуточного программного обеспечения сеанса. Если это /error, то не вызывайте промежуточное программное обеспечение сеанса.

Последнее можно сделать так:

const sessionHandler = session({
    secret: config.secrets.session,
    saveUninitialized: false,
    resave: false,
    store: sessionStore,
    proxy: true,
    cookie: {
        maxAge: config.token_duration,
        secure: false
    }
    // rolling: false
});

app.use(function(req, res, next) {
    // if path does not start with /error/, then invoke session middleware
    if (req.url.indexOf("/error/") !== 0) {
        return sessionHandler(req, res, next);
    } else {
        next();
    }
});
person jfriend00    schedule 08.02.2017
comment
Я использовал ваш первый подход, работал как шарм! Я уже пробовал ваш последний подход, но, поскольку я использую промежуточное программное обеспечение безопасности (github.com/krakenjs/lusca) Мне пришлось вызвать app.use(session... вместо того, чтобы хранить его в переменной. Спасибо! - person Bernardo; 09.02.2017
comment
@Bernardo - вы можете хранить это в переменной. Я не уверен, почему вы думаете, что это не сработает. В app.use(session(...)) часть session() выполняется только один раз при запуске приложения и возвращает новую промежуточную функцию, которую использует app.use(). Это именно то, что делает мой пример sessionHandler. То же самое. - person jfriend00; 09.02.2017
comment
да, я думаю, когда я пытался, я сделал ошибку при назначении переменной - person Bernardo; 14.02.2017
comment
Обратите внимание, что во втором примере вы должны вызывать next() вне блока if, если у вас есть последующее вызываемое промежуточное ПО. Я считаю, что session() будет неявно вызывать next() для обработанных маршрутов. - person stephen mc; 18.12.2018
comment
@stephenmc - Вы правы. Я отредактировал, чтобы исправить. Спасибо. - person jfriend00; 18.12.2018