Проблема в том, что вам нужно получить новый токен после запроса POST Ajax, потому что после использования токена он становится недействительным. Вот код для этого:
В рельсах всякий раз, когда отправляется ответ POST, добавьте следующие параметры в ответ:
def someMethod:
result[:csrfParam] = request_forgery_protection_token
result[:csrfToken] = form_authenticity_token
render :json => result
end
Теперь на стороне JS, в функции успеха каждого метода POST вы можете вызвать эту функцию:
var setCsrfToken = function(param, token) {
if(param == null || token == null) {
console.error("New CSRF param/token not present");
}
$("input[name='" + param + "']").val(token);
}
как это:
setCsrfToken(result["csrfParam"], result["csrfToken"]);
Эта функция будет сбрасывать все параметры authenticity_token во всех формах POST, чтобы следующий запрос имел действительный токен. Вы должны убедиться, что это происходит при каждом вызове POST, иначе вы продолжите сталкиваться с этой проблемой.
Кроме того, CSRF не для предотвращения кликджекинга, это отдельная атака, когда другой веб-сайт может заставить пользователя щелкнуть ссылку, которая выполняет действие на вашем веб-сайте во время сеанса пользователя.