我正在运行 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/