jQuery CSRF не работает - ForbiddenError: неверный токен csrf - PullRequest
0 голосов
/ 27 марта 2019

У меня есть некоторый код jQuery, который срабатывает при нажатии кнопки в модале на моей странице, чтобы удалить определенные элементы со страницы. Этот код работал в прошлом, но я начал замечать проблемы, когда добавил промежуточное программное обеспечение для добавления косой черты в методы GET и HEAD или если это не связано с кодом, создающим токен csrf и DELETE спусковой крючок. Я получаю ошибку ForbiddenError: invalid csrf token

На той же странице, где запускается модал, у меня есть следующее, поэтому я знаю, что токен CSRF существует, и когда я POST, запись обновляется:

<form action="/app/blog/edit/2jVE2rGEmp/?_csrf=1POIam29-Psd35YjTfDzAKHnGDLxw8zaccccacURY" method="post" enctype="multipart/form-data" id="blogEditSubmission">
                <input type="hidden" name="_csrf" value="1POIam29-Psd35YjTfDzAKHnGDLaccccacURY">

Однако, как я уже говорил, методы DELETE существуют в модальном режиме, который запускается с помощью jQuery и имеет собственный генератор csrf.

//Call DELETE route for tag
    $('#delete-tag-button').click(function(){

        var CSRF_HEADER = 'X-CSRF-Token';

        var setCSRFToken = function (securityToken) {
          jQuery.ajaxPrefilter(function (options, _, xhr) {
            if (!xhr.crossDomain) {
              xhr.setRequestHeader(CSRF_HEADER, securityToken);
            }
          });
        };

        setCSRFToken($('input[name="_csrf"]').attr('value'));

        var pathArray = window.location.pathname.split('/');
        var blogId = pathArray[4];

        var tagField = $('#tag-id').val();

        $.ajax({
            method: 'DELETE',
            url: '/app/blog/' + blogId + '/tag/' + tagField + '/',
            success: function(){
                window.location.replace('/app/blog/edit/' + blogId);
            },
            error: function(error){
                console.log(error);
            }
        });

    });

На сервере у меня работает следующее промежуточное ПО, которое раньше не было проблемой:

//Set CSRF for Form Tokens
app.use(csrf());
app.use(function(req, res, next){
    res.locals._csrf = req.csrfToken();
    next();
});

Есть ли что-то, что выделяется, что может быть причиной того, что мой вызов jQuery больше не работает. Может ли это быть связано с переадресацией '/' с моего промежуточного ПО на конец пути URL, если это "GET" или "HEAD"?

...