Javascript Node.js--未定义CSRF令牌
我一直在努力实现CSRF令牌生成,我不知道我做错了什么 server.js:Javascript Node.js--未定义CSRF令牌,javascript,node.js,csrf,Javascript,Node.js,Csrf,我一直在努力实现CSRF令牌生成,我不知道我做错了什么 server.js: // set up ====================================================================== var express = require('express'); var port = process.env.PORT || 8080; var mongoose = require('mongoose'); var fs = requ
// set up ======================================================================
var express = require('express');
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var fs = require('fs');
var csrf = require('csurf');
.
.
.
var app = express();
app.use(csrf());
app.use(function(req, res, next) {
res.locals.token = req.csrfToken();
next();
});
.
.
.
login.ejs:
<form action="/login" method="post">
<!--form fields-->
</form>
.
.
.
<input type="hidden" name="_csrf" value="<%= token %>">
<input type="hidden" name="_csrf" value="<%= csrfToken >">
编辑:server.js现在看起来像这样:
var express = require('express');
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var fs = require('fs');
var csrf = require('csurf');
.
.
.
var app = express();
require('./config/express')(app, __dirname);
require('./config/routes')(app);
app.use(csrf());
app.use(function(req, res, next) {
res.locals.token = req.csrfToken();
next();
});
登录页面现在加载,但CSRF令牌未定义。表单中的值错误 它不应该只是 value=“” 而是 value=“” 尝试: 首先安装csurf模块(): 在server.js中
var router = express.Router();
var csrf = require('csurf');
var csrfProtection = csrf();
router.use(csrfProtection);
router.get('/user/login/', function(req, res, next){
res.render('user/login', {csrfToken: req.csrfToken()});
});
在login.ejs中:
<form action="/login" method="post">
<!--form fields-->
</form>
.
.
.
<input type="hidden" name="_csrf" value="<%= token %>">
<input type="hidden" name="_csrf" value="<%= csrfToken >">
//您需要=输入字段是否应该在表单中?是的,我有点疏忽。但是,在修复之后,我仍然会收到相同的错误。您显示的
app.use()
语句是否在所有路由之前出现?似乎您的/login
路由在两个中间件之前。在路由之后移动app.use()语句允许加载登录页面,但现在csrf令牌未定义。不,那些app.use()
行肯定需要在路由之前。否则,token
肯定不会为视图定义。如果在路由之前的行中也出现同样的错误,那么res.locals
必须在这些中间件之后的某个地方被覆盖。