Проблема с токеном CSRF при запросах извне браузера на сервер Rails

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

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

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

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

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

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

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам