Невозможно отправить форму в другой поддомен через Ajax (ВНИМАНИЕ: невозможно проверить подлинность токена CSRF)

Я пытаюсь отправить удаленную форму на другой поддомен (example.domain.com) из формы (domain.com), но я продолжаю получать предупреждение WARNING: Can't verify CSRF token authenticity в журнале, а инспектор в Chrome сообщает мне, что статус запроса - (canceled), с типом application/x-www-form-urlencoded.

Это форма: button_to "Follow", follow_users_url(subdomain: post.user_username_slug), remote: true

Когда я удалил remote: true, я получил результат, к которому я стремился. Кроме того, при попытке использовать ту же форму в том же субдомене действия (example.domain.com) я получил правильный результат.

Я нашел способ поделиться файлами cookie во всех поддоменах (domain: :all в session_store.rb), но не могу найти способ поделиться токеном в запросах Ajax.

Я использую Rails 3.1.3, Ruby 1.9.3 и jQuery 1.7.1.

Кто-нибудь может мне помочь, пожалуйста?

Изменить:

Кажется, проблема связана с CORS. Теперь я пытаюсь найти решение с минимальным трением, чтобы заставить эти (асинхронные) запросы перекрестных поддоменов работать.


person Leandro Maioral    schedule 19.01.2012    source источник


Ответы (2)


Включите в параметры POST поле «Authenticity_token» со значением, возвращаемым помощником * form_authenticity_token *. (Это не имеет никакого отношения к файлам cookie).

Изменить. Я думаю, вы сталкиваетесь с политикой одного и того же происхождения, которая не позволяет javascript из домена A взаимодействовать с доменом B (также применяется к поддоменам). Для этого существует «переопределение», называемое CORS, которое домен, с которым вы разговариваете, должен реализовать.

Итак, если у вас есть контроль над доменом A и B, вы можете обойти это ограничение. Это объясняет, почему «нормальные» запросы работают, а запросы «: remote => true» - нет. (Вероятно, ошибка токена CSRF неверна.) Вот статья о настройке CORS в Rails (домен B, в моем примере).

person bioneuralnet    schedule 19.01.2012
comment
Заглянув в исходный код страницы, вы увидите, что для button_to. <form action="http://leandro.project.dev/users/follow" class="button_to" data-remote="true" method="post"> <div> <input type="submit" value="Follow" /> <input name="authenticity_token" type="hidden" value="Y3oJyRQCbl0o/GnRdJaxBTAjqjwSDZ6PEEtaR6zy+FM=" /> </div> </form> - person Leandro Maioral; 19.01.2012
comment
Я думаю, что ваш токен авторизации в порядке и является неточной ошибкой. Доказательства указывают на то, что это нарушение Политики одинакового происхождения. Смотрите мою правку. - person bioneuralnet; 19.01.2012
comment
Я прочитаю пост и вернусь с результатом. Спасибо вам за это. - person Leandro Maioral; 19.01.2012
comment
Я прочитал сообщение и понял ограничение. Я просто не знаю, как реализовать для этого решение с минимальным трением. Мне нужно будет очень часто запрашивать через поддомены с разными контроллерами. - person Leandro Maioral; 19.01.2012
comment
Я бы предложил поместить два метода cors в ваш контроллер приложений. Затем вы можете просто добавить фильтры к конкретным контроллерам; Так не должно быть слишком много дублирования. Что касается ваших маршрутов, я не уверен, есть ли способ создать общий маршрут с опциями. Может быть хороший совет на codeodor.com/index.cfm/2011/7/26/ или stackoverflow.com/questions/2858741/ - person bioneuralnet; 20.01.2012

Вы можете установить одинаковый токен аутентичности в обоих контроллерах.

Я думаю, что это

protect_from_forger: secret => 'long_secret_string'

Если оба контроллера используют один и тот же токен, вы сможете публиковать сообщения в поддоменах или на других сайтах. Однако вы открываете некоторые дыры для межсайтового скриптинга

person Rob Sutherland    schedule 19.01.2012