node.js - 将 Angular 和 Node Express CSRF 与 Redis session 一起使用,如何在 session 过期后重置 session 信息和 CSRF?

标签 node.js angularjs session express redis

我正在运行 Express 和 NodeJS 作为 Angular 前端的后端。我在 session 中使用 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 session 过期之前,一切都顺利进行(我在我的配置中设置了两个小时)。 session 过期后,我收到禁止错误:

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

问题是我无法弄清楚如何捕获此错误并重置 RedisSession(和 CSRF token ),结果,单页 Angular 前端似乎已死,需要刷新页面才能抓取一个新的 session 并恢复一切。

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

最佳答案

您可以触摸 session ,这样它就不会过期...

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/...”路径时,例如,您的 session 过期都可能被推迟...

实际上,在我们最新的项目中,我们不再使用 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()

关于node.js - 将 Angular 和 Node Express CSRF 与 Redis session 一起使用,如何在 session 过期后重置 session 信息和 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979048/

相关文章:

node.js - 服务器不断运行更新缓存的功能,它会阻止所有其他服务器功能吗?

javascript - 在 Angular 中从 ng-change 运行 Javascript 函数

javascript - 在 Angular 中要求/浏览连帽衫

python - 如何在 GAE 中使用烧杯

session - 有环回 + Passport + jwt 的例子吗?

node.js - 将Bootstrap主题添加到具有 Node 依赖性的 Electron 应用程序

javascript - 使用 backbone.js 组织 subview ?

angularjs - 错误 : GET 404 (Not found) error for images, 但图像显示正常

javascript - 如何在 Yii 框架中使用表单添加 "Novalidate"。我正在使用 Angularjs

c# - 在浏览器中查看 session 变量