Не удается опубликовать форму в другом поддомене с помощью Ajax (ВНИМАНИЕ: не удается проверить подлинность токена CSRF) - PullRequest
2 голосов
/ 19 января 2012

Я пытаюсь отправить удаленную форму в другой поддомен (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 .Теперь я пытаюсь найти минимальное решение по трению, чтобы этот (асинхронный) перекрестный запрос поддоменов работал.

Ответы [ 2 ]

3 голосов
/ 19 января 2012

В ваших параметрах POST включите поле «authenticity_token» со значением, возвращаемым помощником * form_authenticity_token *. (Это не имеет ничего общего с куки).

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

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

0 голосов
/ 19 января 2012

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

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

protect_from_forger: secret => 'long_secret_string'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...