如何在 expressjs 的 AJAX 请求(没有 Jquery)中发送 csrf 令牌?

How to send csrf token in AJAX request (Without Jquery) in expressjs?

我正在使用 expressjs 中的 csurf 模块。它适用于所有 post 请求,因为我按以下方式使用它。

app.use(csrf());
res.locals.csrfToken = req.csrfToken();

这样它会自动以所有形式提供,我有以下内容。

<input type="hidden" name="_csrf" value="<%=csrfToken%>">

但是如何在AJAX请求上设置csrftoken,我没有使用jquery,下面是发送AJAX请求的JS函数。我确实在 html 上拥有可用的 csrf 令牌作为我可以通过 getElementByID 访问的隐藏值。

注意:如果我禁用 csrf,我可以发送请求。

function voteQuestion () {
    var qid = document.getElementById("qid").value;
    var csrf = document.getElementById("csrf").value;
    var http = new XMLHttpRequest();
    var url = "/q/ajaxcall";
    var params = "qid="+ qid;
    http.open("POST", url);
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.onreadystatechange = function() {
    if(http.readyState == XMLHttpRequest.DONE && http.status == 200) {
         var json = (http.responseText);
         var obj = JSON.parse(json);

         document.getElementById("vote-sp").innerHTML = (obj.upvotes);
    }
};
http.send(params);

}

在您的 params 中设置 crsf 令牌,如下所示..

var params = "qid="+ qid + "&crsf="+csrf;

您可以创建一个用于发送数据的新对象,如下所示..

var data = {};   //crates new object
data.qid = qis;  //adds qid to object
data.csrf = csrf; //adds qid to object

params = data;   // to server

我已经尝试解决这个问题将近一个星期了,只是决定 console.log req.session 并发现 cookie 包含 "XSRF-TOKEN" 值,所以在 AJAX 请求 header 我将 XSRF-TOKEN 设置为 csrf,现在它可以工作了,我不知道为什么它以这种方式工作,特别是对于 AJAX 请求。

setRequestHeader("XSRF-TOKEN", csrf);