2014-01-07 43 views
2

我正在運行Express和NodeJS作爲角度前端的後端。我正在使用RedisStore進行會話。使用this blog article,我能想出下面的代碼:在會話過期後如何使用Angular和Node 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

好吧,從來沒有得到一個關於如何正確地捕獲在Node中的錯誤的答案,但在此期間,我在我的角度前端捕捉錯誤,並調用'$ 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的POST或獲取任何「/ 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() 
相關問題