簡體   English   中英

在Angis Session中使用Angular和Node Express CSRF,如何在會話到期后重置會話信息和CSRF?

[英]Using Angular and Node Express CSRF with Redis Session, how to reset session info and CSRF after session expiring?

我正在運行Express和NodeJS作為角度前端的后端。 我正在使用RedisStore進行會話。 使用這篇博客文章 ,我能夠提出以下代碼:

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令牌),因此,單頁角度前端剛剛顯示為死並且需要頁面刷新才能獲取新會話並恢復事物。

其他人遇到這個問題? 提前致謝

您可以觸摸會話,因此它不會過期...

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或GET到任何'/ 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM