Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js--未定义CSRF令牌_Javascript_Node.js_Csrf - Fatal编程技术网

Javascript Node.js--未定义CSRF令牌

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

我一直在努力实现CSRF令牌生成,我不知道我做错了什么

server.js:

// 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
必须在这些中间件之后的某个地方被覆盖。