我开始学习NodeJs
,并由于对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();
});
然后,我为用户注册创建了一个基本的.ejs
视图:
<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
被上面的middleware
占据。
当用户按下按钮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:无效的CSRF令牌
这是路由方法:
app.post('/registerUser', function(req, res, next){
//todo
});
答案 0 :(得分:1)
来自csurf docs:
在视图内部,将csrfToken值设置为名为_csrf的隐藏输入字段的值
首先,对此进行更改:
<meta name="csrf-token" content="<%= csrfToken %>">
对此:
<input type="hidden" name="_csrf" value="<%= csrfToken %>" id="csrf">
然后在jQuery页面上更改此内容:
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问题是您解决问题的很好参考。