Ошибка токена CSRF возникает при использовании турболинков с ruby ​​on rails

Ошибка токена CSRF (Невозможно проверить подлинность токена CSRF.) Произойдет, если на странице перехода будет выполнена пост-передача с использованием турбоссылок.

Но при перезагрузке страницы ошибки не возникает.

Как я могу это решить?


Мистер Марк

Спасибо за ответ.

Это связано с тем, что csrf-токен заголовка отличается от csrf-токена формы?

Почему csrf-токен отличается при использовании turbolink?

Я решил это следующим образом, а как вы думаете?

$(document).on('turbolinks:load', function() {
  token = $("meta[name='csrf-token']").attr("content"); 
  $("input[name='authenticity_token']").val(token)
});
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
811
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Популярный вопрос последних дней...

Я бы предложил следующее:

ПРЕДУПРЕЖДЕНИЕ: невозможно проверить подлинность токенов 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-token in meta tag is different from authenticity_token in the form. I believe turbolinks could 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 представления.

Другие вопросы по теме