Node.js csurf无效的CSRF令牌

4

我正在使用express和nom的csurf模块。最近3天一直都很完美,但现在每次提交表单时都会出现无效的csrf令牌错误。我使用的是最新版本的csurf和express。

我的app.js设置:

var csrf = require('csurf');
...   
app.use(csrf());
...
app.use(function (req, res, next) {
    res.locals = {
        csrf: req.csrfToken(),...

我的Jade模板:

form(role='form', method='post', action='/auth')
                            input(type='hidden', name='_csrf', value='#{csrf}')
                            ...
                            input.btn.btn-success.btn-block(type='submit')

以下是我经常遇到的错误:

Error: invalid csrf token
at createToken (/Users/.../.../.../.../node_modules/csurf/index.js:107:19)
at /Users/.../.../.../.../node_modules/csurf/index.js:91:7
at Object.<anonymous> (/Users/.../.../.../.../node_modules/csurf/node_modules/csrf-tokens/node_modules/uid-safe/index.js:13:7)
at Object.ondone (/Users/.../.../.../.../node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:177:31)

据我理解,这个错误是在启动服务器后出现的,而且会得到“没有打开的连接”错误。


请检查您调用中间件的顺序。很可能您的中间件调用顺序不正确。请确保在use(app.router)之前调用csrf中间件和对res.locals的赋值。 - adamK
@adamK,我已经检查过了。一切都是需要的顺序。 - jumrifm
1
你解决了这个问题吗?我的csrf也因为某些原因突然停止工作了。 - David Losert
@Charminbear,是的,我解决了这个问题。你可能正在使用安全的cookies,请在您的app.js文件中检查一下。我在检查我的浏览器中的cookies之后找到了解决方案(它们没有为此网站设置)。 - jumrifm
1个回答

0

你试试:

在路由器中

var csrf = require('csurf');

var csrfSecured = csrf();
router.use(csrfSecured);

router.get('/auth', function(req, res, next) {
    res.render('user/auth', {
        ...
        csrfToken: req.csrfToken(),
        ...
    }
}

在视图中:

input(type='hidden', name='_csrf', value='#{csrfToken}')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接