2014-01-07 3 views
2

Я запускаю Express и NodeJS в качестве backend для углового интерфейса. Я использую RedisStore для сеансов. Используя this blog article, я был в состоянии придумать следующий код:Использование Углового и Узлового Express CSRF с сеансом Redis, как сбросить информацию о сеансе и CSRF после окончания сессии?

app.use express.cookieParser(config.session.signed) 
app.use express.session({ 
    secret: config.session.secret, 
    cookie: config.session.cookie, 
    store: new RedisStore({ 
    client: client 
    }) 
}) 

app.use express.csrf() 
app.use (req, res, next) -> 
    res.cookie('XSRF-TOKEN', req.session._csrf) 
    next() 

app.use passport.initialize() 
app.use passport.session({}) 

Все работает гладко до истечения Redis сессии (у меня есть этот набор в течение двух часов в моей конфигурации). По истечении срока действия сеанса, я получаю запрещенную ошибку:

Error: Forbidden 
    at Object.exports.error (/code/node_modules/express/node_modules/connect/lib/utils.js:62:13) 
    ... 

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

Кто-нибудь еще сталкивается с этой проблемой? Заранее спасибо

+0

Вы поняли это? Запуск в это тоже ... –

+0

Ну, так и не получил ответа о том, как правильно уловить ошибку в узле, но тем временем я улавлю ошибку в своем угловом интерфейсе и вызывая '$ route.reload()' для обновления страницы и захвата нового файла cookie. Это немного меньше, чем идеально, потому что в случае события входа в систему я должен поймать ошибку, перезагрузить маршрут и затем повторно отправить запрос, чтобы пользовательский интерфейс был бесшовным. Но это действительно работает. – Kevin

ответ

1

Вы можете сенсорные сеанс, поэтому он не истекаете ...

app.all('/*', function(req, res, next) { 
    if ('HEAD' === req.method || 'OPTIONS' === req.method) return next(); 

    req.session._garbage = new Date() 
    req.session.touch() 
    next(); 
}); 

Так каждый раз, когда ваш SPA стоек или GETs любого «/ API/...» путь Например, ваша таймаута сессии может получить отложена ...

на самом деле, в нашем последнем проекте мы не используем express.csrf() больше, но некоторые формы этого:

if('GET' isnt req.method) 
    token = (req.body and req.body._csrf) or (req.query and req.query._csrf) or (req.headers["x-csrf-token"]) or (req.headers["x-xsrf-token"]) 
    if token isnt req.session._csrfSecret 
    return res.json 403, 'action forbidden: invalid application status, please refresh' 
else 
    unless req.session._csrfSecret 
    req.session._csrfSecret = cryptos.long_token() 

req.session.touch() 
Смежные вопросы