Проблема с токеном CSRF при запросах извне браузера на сервер Rails - PullRequest
3 голосов
/ 02 июня 2011

Мне нужно сделать запрос HTTP POST извне браузера, но серверная часть Rails не принимает аутентификацию (ошибка 401). Я знаю, что в таких случаях мне нужно передать токен CSRF, но он не работает.

Когда я делаю запрос через форму в браузере, он работает как положено, но когда я пытаюсь смоделировать идентичный запрос (с точки зрения заголовков и файлов cookie) извне браузера (например, с помощью curl), аутентификация не работает.

Два небольших изменения позволили мне добиться успеха без браузера: (1) отключив protect_from_forgery, который проверяет CSRF или (2), используя GET вместо POST для запроса. В обоих случаях достаточно передать cookie. Это означает, что проблема определенно связана с CSRF.

Итак, мой вопрос: как я могу создать защищенный CSRF HTTP POST на сервер Rails без использования браузера?

Чтобы уточнить, процесс разбивается на три этапа:

  1. Логин : возвращает cookie для идентификации сеанса;

  2. Новый : запрос GET, который возвращает токен CSRF для последующего использования (использует cookie);

  3. Создать : запрос POST, который отправляет информацию, которую я хочу создать (использует как cookie сеанса, так и токен CSRF).

Единственный неудачный шаг - третий.

1 Ответ

2 голосов
/ 02 июня 2011

Если ваш токен CSRF основан на файлах cookie, то программе, которую вы используете для выполнения запросов, необходимо отслеживать файлы cookie. Проверьте параметр --cookie-jar в curl.

...