我试图让表单在我的快速应用中工作。我有一个中间件函数,它将csrf标记req.session._csrf传递给res.locals.csrf_token,以便视图可以使用它。现在我试图在我的视图中使用本地变量,并从会话中间件中获取禁用的错误。CSRF令牌在提交表单时无法正常工作
这里是我的表单代码 - 我使用的车把我的模板引擎:
<form method='post' action='/api/entries' enctype='multipart/form-data' >
<input type='hidden' name='_csrf' value={{csrf_token}} />
<input class='foo' type='text' />
<input class='bar' type='text' />
<button id='submit' type='submit'> SUBMIT
</form>
我已经尝试过使用和不使用双花括号既不作品引用csrf_token变量。关于我做错什么的想法?错误:禁止发生在我的路由功能被发送到/ api /条目之前甚至被调用。所以我敢肯定,问题是,我做一些错误引用CSRF令牌..
* 编辑: *问候到“req.session._csrf已过时,使用req.csrfToken ()而不是“登录到控制台,我没有:
grep -r '_csrf' .
在我的应用程序目录。这里是输出..它看起来并不像我除了看,在我的藏CSRF场被命名为“_csrf”随处引用它..
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: var secret = req.session._csrfSecret;
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: req.session._csrfSecret = secret;
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: Object.defineProperty(req.session, '_csrf', {
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: console.warn('req.session._csrf is deprecated, use req.csrfToken() instead');
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: return (req.body && req.body._csrf)
./node_modules/express/node_modules/connect/lib/middleware/csrf.js: || (req.query && req.query._csrf)
./v/home.hbs: <input type='hidden' name='_csrf' value={{csrf_token}} />
./v/show.hbs: <input type='hidden' name='_csrf' value={{csrf_token}} />
这里是整个错误栈我是试图张贴到/ API时获取/条目端点(我愚蠢地忽视了之前提到这一点,但我使用连接,Redis的会话中间件):
Error: Forbidden
at Object.exports.error (appFolder/node_modules/express/node_modules/connect/lib/utils.js:63:13)
at createToken (appFolder/node_modules/express/node_modules/connect/lib/middleware/csrf.js:82:55)
at Object.handle (appFolder/node_modules/express/node_modules/connect/lib/middleware/csrf.js:48:24)
at next (appFolder/node_modules/express/node_modules/connect/lib/proto.js:193:15)
at next (appFolder/node_modules/express/node_modules/connect/lib/middleware/session.js:318:9)
at appFolder/node_modules/express/node_modules/connect/lib/middleware/session.js:342:9
at appFolder/node_modules/connect-redis/lib/connect-redis.js:101:14
at try_callback (appFolder/node_modules/redis/index.js:580:9)
at RedisClient.return_reply (appFolder/node_modules/redis/index.js:670:13)
at ReplyParser.<anonymous> (appFolder/node_modules/redis/index.js:312:14)
编辑2:在连接错误-redis.js是一个试图通过会话ID获取当前会话并失败的函数。不知道为什么会发生这种情况,我的connect-redis设置看起来是正确的。这正在杀死我
你是如何渲染模板?你传递的值是'csrf_token'? – WiredPrairie
我有一个函数在我的快速配置,看起来像:app.use(函数(REQ,RES,下一个){res.locals.csrf_token = req.session._csrf;下一步();}) – amagumori
我试着明确地添加它到res.render()中包含的本地对象,并且这些对象不起作用 – amagumori