Мне нужно сделать запрос HTTP POST
извне браузера, но серверная часть Rails не принимает аутентификацию (ошибка 401). Я знаю, что в таких случаях мне нужно передать токен CSRF, но он не работает.
Когда я делаю запрос через форму в браузере, он работает как положено, но когда я пытаюсь смоделировать идентичный запрос (с точки зрения заголовков и файлов cookie) извне браузера (например, с помощью curl), аутентификация не работает.
Два небольших изменения позволили мне добиться успеха без браузера: (1) отключив protect_from_forgery
, который проверяет CSRF или (2), используя GET
вместо POST
для запроса. В обоих случаях достаточно передать cookie. Это означает, что проблема определенно связана с CSRF.
Итак, мой вопрос: как я могу создать защищенный CSRF HTTP POST
на сервер Rails без использования браузера?
Чтобы уточнить, процесс разбивается на три этапа:
Логин : возвращает cookie для идентификации сеанса;
Новый : запрос GET
, который возвращает токен CSRF для последующего использования (использует cookie);
Создать : запрос POST
, который отправляет информацию, которую я хочу создать (использует как cookie сеанса, так и токен CSRF).
Единственный неудачный шаг - третий.