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