javascript-使用ajax时无效的csrf令牌

前端之家收集整理的这篇文章主要介绍了javascript-使用ajax时无效的csrf令牌 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我开始学习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();
});

然后我为用户注册创建了一个基本的.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由上面的中间件使用.
用户按下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请求,正确传递令牌:

enter image description here

但是在控制台中,我得到了:

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">

然后在您的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问题对于您的问题是一个很好的参考.

猜你在找的jQuery相关文章