Как мне заставить Rails 3.1 не добавлять X-CSRF-Token к моим запросам JSONP, которые отправляются третьему лицу?

#javascript #ruby-on-rails #ruby-on-rails-3 #jsonp

#javascript #ruby-on-rails #ruby-on-rails-3 #jsonp

Вопрос:

Я использую стороннюю клиентскую библиотеку JavaScript, которая использует jQuery для отправки запросов JSONP. Запросы помечаются X-CSRF-Token, но Google Chrome блокирует их, говоря

XMLHttpRequest cannot load [...]. Request header field X-CSRF-Token is not allowed by Access-Control-Allow-Headers.

Как мне заставить Rails 3.1 не добавлять X-CSRF-Token к моим запросам, которые отправляются третьей стороне?

Ответ №1:

У меня только что возникла эта проблема. Эта ошибка фактически исправлена в текущей версии jquery-rails для разработки.

То, что там происходит, связано с функцией CSRFProtect помощников rails, которая добавляет этот заголовок к каждому запросу ajax, но это не имеет смысла для междоменного. Начиная с jQuery 1.5, вы можете добавить crossDomain опцию в конфигурацию ajax, чтобы заставить запросы считаться междоменными, и текущая версия jquery-rails здесь это исправляет.

Теперь есть два способа установить параметр crossDomain:

  • Если вы создаете форму или ссылку, вы можете добавить, соответственно, :html => {'data-cross-domain' => true} или 'data-cross-domain' => true (см. исходный код)
  • Если вы используете $.ajax функцию raw, то просто не забудьте добавить crossDomain: true в параметры.

TL; DR обновите jquery_rails до последней версии (т. е. текущей версии разработчика в github) и запомните параметр crossDomain.