Не удается проверить подлинность токена CSRF Rails / React - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть компонент реагирования в моем приложении rails, где я пытаюсь использовать fetch() для отправки POST в мое приложение rails, размещенное на localhost, это выдает мне ошибку:

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

Я использую devise gem для обработки user/registrations и logins.

Я пытался удалить protect_from_forgery with: :exception

Вот код для моей выборки,

this.state.ids.sub_id});
  fetch(POST_PATH, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: body  
  }).then(res => res.json()).then(console.log);

Как я могу получить токен csrf и отправить его через форму, чтобы он прошел?
В идеале я хотел бы просто отправить его через заголовки, но не знаю, как получить доступ к токену.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Спасибо!Я закончил с этим в качестве рабочего решения: в представлении, которое отображает мой реагирующий компонент

<% csrf_token = form_authenticity_token %>

<%= react_component('ExerciseDisplay', {
  program: @program.subprograms.first.exercises, ids: {sub_id: @program.subprograms.first.id, team_id: @team.id, token: csrf_token}
}) %>

, я передал токен в состояние и затем получил к нему доступ через fetch:

  fetch(POST_PATH, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CSRF-Token': this.state.ids.token
      },
      body: body  
}).then(res => res.json()).then(console.log);
0 голосов
/ 06 мая 2019

Я тоже столкнулся с той же проблемой при использовании rails 5.2 , и мне удалось исправить эту проблему, добавив

protect_from_forgery with: :null_session в application_controller.rb Я получил это отсюда, пожалуйста, отошлите это

0 голосов
/ 21 февраля 2019

Самый простой способ сделать это, если вы просто встраиваете компонент реагирования в представление Rails, - это получить токен csrf из представления rails, а затем передать его в качестве заголовка в вызове API fetch.

Вы можете получить токен csrf, выполнив что-то вроде этого:

const csrf = document.querySelector("meta[name='csrf-token']").getAttribute("content");

А затем просто передайте его в качестве заголовка в вызове fetch: ... headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrf }, ...

Обычно я нене используйте fetch, поэтому не слишком уверен в точном синтаксисе, но это должно помочь вам.

...