javascript - 使用 ajax 时无效的 csrf token

标签 javascript jquery node.js express ejs

我开始学习 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 View :

<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 请求, token 已正确传递:

enter image description here

但在控制台中我得到:

ForbiddenError: invalid csrf token

这是路由方法:

app.post('/registerUser', function(req, res, next){
    //todo
});

最佳答案

首先感谢您,因为您已经开始使用 nodejs 并亲自尝试这些东西。

由于编写正确,因此无需更改结构或代码本身。只有一个错误导致了这个问题,它在您的 csrf 初始化中。请在您的 csrf 初始化中添加 cookie 参数,如下所示:

app.use(csrf({ cookie: true }));

此外,请始终在您的应用程序中使用 session 存储。以下是使用快速 session 作为 session 存储的示例:

var session        = require('express-session');
var MemoryStore    = require('session-memory-store')(session);

app.use(session({
    store : new MemoryStore({ expires : 86400, checkperiod : 1800}),
    secret: 'foofofoo',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true }
}));

关于javascript - 使用 ajax 时无效的 csrf token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54892601/

相关文章:

javascript - 检查样式表是否加载然后渲染元素

javascript - 如何解析来自 mysql 跟踪数据库的数据?

javascript - 如何使用 XMLHttpRequest() 将内容转发到日志服务器?

Jquery选择器问题

javascript - 为什么我的 next() 和 prev() 切换的文本输出不正确?

javascript - 在页面加载时启动 Fancybox,无需单击一次

javascript - 嵌套 module.exports 的说明

javascript - 如何创建具有重复键的 JSON 对象

javascript - "Partial Function Application"在 Javascript 上下文中是用词不当吗?

javascript - 为什么我的日期验证正则表达式不能识别二月(和其他)?