【问题标题】:Using Angular and Node Express CSRF with Redis Session, how to reset session info and CSRF after session expiring?使用 Angular 和 Node Express CSRF 和 Redis 会话,会话过期后如何重置会话信息和 CSRF?
【发布时间】:2014-01-25 13:45:53
【问题描述】:

我正在运行 Express 和 NodeJS 作为 Angular 前端的后端。我正在使用 RedisStore 进行会话。使用this blog article,我能够想出以下代码:

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 令牌),结果,单页 angular 前端似乎死了,需要刷新页面才能抓取一个新的会话和恢复的东西。

还有其他人遇到过这个问题吗?提前致谢

【问题讨论】:

  • 你发现了吗?也遇到这种情况...
  • 好吧,从来没有得到关于如何正确捕获 Node 中的错误的答案,但与此同时,我在我的 Angular 前端中捕获了错误并调用 $route.reload() 来更新页面并抓取一个新的饼干。这只是不太理想,因为在登录事件的情况下,我必须捕获错误,重新加载路由,然后重新发送请求以保持用户体验无缝。但它确实有效。

标签: node.js angularjs session express redis


【解决方案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 或 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()

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 2017-10-09
    • 2012-08-03
    • 2012-09-01
    • 2012-09-24
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多