Недопустимый токен подлинности при создании POST в одном приложении - PullRequest
0 голосов
/ 06 марта 2019

Я понимаю, что защита CSRF дает некоторую гарантию того, что запрос возник из вашего собственного веб-приложения.Однако я передаю переменную из JS в Rails в том же приложении, используя:

app/views/statistics/select.js
$.ajax({
  method: "POST",
  url: "statistics/plot",
  dataType: "script",
    data: {  
    country_id: 7 
  }
});

маршруты:

post '/statistics/plot(:country_id)' => 'statistics#plot'

Контроллер:

class StatisticsController < ApplicationController
  def plot
    @selected_countries = params[:country_id]

    respond_to do |format|
      format.html{ redirect_to root_path }
      format.js
      format.json { render json: @selected_countries }
    end
  end
end

Возвращено:

Started POST "/statistics/plot" for ......... 
Started GET "/" for ........
Processing by StatisticsController#plot as JS
  Parameters: {"country_id"=>"7"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

Есть какие-нибудь идеи о том, что я могу делать неправильно, когда приложение занимает пост, как будто оно исходит от внешнего приложения или API?Я искал похожие сообщения, но большинство из них касалось отключения CSRF при получении данных из API или аутентификации запросов API с помощью ключа API.В моем случае я отправляю данные в том же приложении.

1 Ответ

0 голосов
/ 06 марта 2019

ВНИМАНИЕ: Невозможно проверить рельсы подлинности токена CSRF похоже, что это решает вашу проблему:

Вы должны сделать это:

Убедитесь, что выиметь <% = csrf_meta_tag%> в вашем макете

Добавить beforeSend для всех запросов ajax для установки заголовка, как показано ниже:

$.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);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...