Ошибка токена CSRF (Невозможно проверить подлинность токена CSRF.) Произойдет, если на странице перехода будет выполнена пост-передача с использованием турбоссылок.
Но при перезагрузке страницы ошибки не возникает.
Как я могу это решить?
Мистер Марк
Спасибо за ответ.
Это связано с тем, что csrf-токен заголовка отличается от csrf-токена формы?
Почему csrf-токен отличается при использовании turbolink?
Я решил это следующим образом, а как вы думаете?
$(document).on('turbolinks:load', function() {
token = $("meta[name='csrf-token']").attr("content");
$("input[name='authenticity_token']").val(token)
});





Популярный вопрос последних дней...
Я бы предложил следующее:
ПРЕДУПРЕЖДЕНИЕ: невозможно проверить подлинность токенов CSRF.
Make sure that you have <%= csrf_meta_tag %> in your layout
Add beforeSend to all the ajax request to set the header like below:
$.ajax({ url: 'YOUR URL HERE',
type: 'POST',
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name = "csrf-token"]').attr('content'))},
data: 'someData=' + someData,
success: function(response) {
$('#someDiv').html(response);
}
});
To send token in all requests you can use:
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name = "csrf-token"]').attr('content')
}
});
Я знаю, что это вопрос летней давности, но это может помочь кому-то нуждающемуся.
The problem here is the
csrf-tokeninmetatag is different fromauthenticity_tokenin the form. I believeturbolinkscould be the culprit here.
Решение, которое сработало для меня:
$(document).on('turbolinks:load', function(){ $.rails.refreshCSRFTokens(); });
Вам понадобятся rails-ujs или jquery-ujs, включенные в ваше приложение. Если вы используете Rails 6, я полагаю, что у вас уже есть rails-ujs по умолчанию.
?? Rails ожидает форму подлинность_токен, но вместо этого отправляется токен CSRF из метатега, потому что вы отправляете форму с любой из этих опций в помощнике формы Rails:
Я решил это, скопировав токен аутентификации из метатега в форму перед отправкой формы:
// application.js
function copyCSRFMetaTagToFormAuthenticityToken() {
document.querySelector('input[name = "authenticity_token"]').value = document.querySelector('meta[name = "csrf-token"]').getAttribute('content');
}
window.copyCSRFMetaTagToFormAuthenticityToken = copyCSRFMetaTagToFormAuthenticityToken
Затем в моем шаблоне:
<%= form_with(url: save_custom_connection_path, method: :post, data: { turbo: false }, :html => { :onsubmit => "window.copyCSRFMetaTagToFormAuthenticityToken()" }) do |form| %>
Уведомление:
:onsubmit => "window.copyCSRFMetaTagToFormAuthenticityToken()"
Я считаю, что это не представляет никакой угрозы безопасности, потому что в любом случае он использует токен CSRF представления.