我开始学习NodeJ,并由于对js的了解而努力,我开始编写一些代码来创建用户注册逻辑.
本质上,我已经通过以下方式配置ExpressJS:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const session = require('express-session');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
app.use(session({
secret: 'foofofoo',resave: false,saveUninitialized: true,cookie: { secure: true }
}));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(csrf());
app.use(function (req,res,next) {
var csrfToken = req.csrfToken();
res.cookie('XSRF-TOKEN',csrfToken);
res.locals.csrfToken = csrfToken;
next();
});
<Meta name="csrf-token" content="<%= csrfToken %>">
<p>
<label class="w3-text-blue"><b>User Name</b></label>
<input class="w3-input w3-border" id="uname" name="uname" type="text"></p>
<p>
<label class="w3-text-blue"><b>Password</b></label>
<input class="w3-input w3-border" id="upass" name="pass" type="text"></p>
<p>
<button class="w3-btn w3-blue" id="regForm">Register</button></p>
csrfToken由上面的中间件使用.
当用户按下regForm按钮时,此代码称为:
$("#regForm").click(function () {
let uname = $("#uname").val();
let upass = $("#upass").val();
let token = document.querySelector('Meta[name="csrf-token"]').getAttribute('content');
let regData =
{
'name': uname,'pass': upass
};
$.ajax({
type: 'POST',url: '/registerUser',headers: {"X-CSRF-Token": token },data: regData,success: function (data) {
$("#mainDiv").html(data);
}
});
});
并查看ajax请求,正确传递令牌:
但是在控制台中,我得到了:
ForbiddenError: invalid csrf token
这是路由方法:
app.post('/registerUser',function(req,next){
//todo
});
最佳答案
从csurf docs开始:
Inside the view,set the csrfToken value as the value of a hidden input field named _csrf
首先,更改此:
<Meta name="csrf-token" content="<%= csrfToken %>">
对此:
<input type="hidden" name="_csrf" value="<%= csrfToken %>" id="csrf">
let token = document.querySelector('Meta[name="csrf-token"]').getAttribute('content');
{
'name': uname,'pass': upass
};
对此:
let token = $('#csrf').val();
{
'name': uname,'pass': upass,'_csrf':token
};
如果您仍然遇到问题,请告诉我当您尝试此操作时会发生什么.
PS:this问题对于您的问题是一个很好的参考.