2016-12-14 15 views
0

Я делаю запрос POST для API REST для загрузки файла. В Почтальоне все работает нормально. Я добавляю базовую авторизацию и настраиваемый токен CSRF (XSRF), который я получаю с сервера.Запрос POST с CSRF работает в Postman, но сбой в cURL

Я хочу сделать то же самое, используя cURL. Я скопировал код из Postman, и он, похоже, не работает. Я считаю, что ошибка связана с CSRF, потому что если я отключу CSRF на сервере и сделаю тот же вызов cURL без токена CSRF, все будет хорошо.

Теперь еще некоторые детали: Вот что команда для Curl, который Почтальон дает:

curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Postman-Token: 76a7a43b-f407-15a2-aaff-5242b44d0f47" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "[email protected]:\Downloads\hello-world.zip" "http://host:port/api/import" 

И это ответ я получаю с --verbose

  • тайм-аут на поиск имени не поддерживается
  • Trying :: 1 ...
  • Подключен к localhost (:: 1) порт 7777 (# 0)
  • POST/API/импорта HTTP/1.1
  • Ведущий: локальный: 7777
  • User-Agent: завиток/7.47.1
  • Accept: /
  • XSRF: 79f51981-8e85-4e26- be1b-bf63aed92a42
  • Авторизация: Basic bbhjbjb =
  • Cache-Control: нет кэша
  • Почтальон-Токен: 76a7a43b-f407-15a2-aaff-5242b44d0f47
  • Контент-длина: 31281
  • Ожидаем: 100-продолжить
  • Тип контента: multipart/form-data; граница = ---- WebKitFormBoundary7MA4YWxkTrZu0gW; граница = ------------------------ 742d3475ac5f6aba
  • < HTTP/1.1 302 Найдено
  • < Set-Cookie: JSESSIONID = 1qfjmbntrthxll; Путь =/api < Истекает: Чт, 01 янв 1970 00:00:00 GMT
  • < Set-Cookie: XSRF = b29bd143-cc80-49ad-b495-711125678o; Path = /; Expires = Thu, 15-Dec-2016 10:28:46 GMT
  • < XSRF: b29bd143-cc80-49ad-b495-711125678o < Расположение:
  • http://localhost:7777/api/login/error.jsp?errorMessage=Access Denied
  • < Content-Length: 0
  • < Сервер: Jetty (9.2.17.v20160517)
  • ошибка HTTP до завершения отправки, прекратить отправку
  • соединение Закрытие 0

Я вероятно, отсутствует что-то очень очевидное здесь, но пока не знаю. Похоже, что я перенаправлен на страницу входа, а не правильно аутентифицирован, но не знаю, почему (я отправляю XSRF в cURL).Я также попытался добавить sessionid в cURL - тоже не работал.

Любые идеи и указания о том, где искать, были бы очень благодарны !!!

+0

Вы пробовали использовать '-L' вариант (из 302 нашел возвращения с сервера) ? –

+0

Спасибо за комментарий! Я попытался с -L получить аналогичный результат примерно в 50 раз: «* Соединение №1 для размещения локального хоста осталось нетронутым * Выдать другой запрос этому URL-адресу:« http: // localhost: 7777/api/login/error.jsp? ErrorMessage = Access + Denied ' * Найден пакет для хоста localhost: 0x285 [can конвейер] * Повторное использование существующего соединения! (# 1) с хостом localhost * Подключено к localhost (:: 1) порт 7777 (# 1) " – lenach87

+0

лучше всего предположить, что токен XSRF является одноразовым токеном, и вы используете его сначала в почтальоне, и он отлично работает, тогда вы используете тот же токен при завивке, а не обновляете его, и он терпит неудачу. как вы получаете токены XSRF? во всяком случае, получить 1, не используя его на почтальоне в первую очередь, проверить, работает ли это – hanshenrik

ответ

0

Непонятно, как реализован ваш код на стороне сервера. Здесь можно увидеть одну видимую разницу: строка UserAgent в заголовке запроса User-Agent: curl/7.47.1. Вы можете попробовать добавить -A "Mozilla/5.0" с запросом на завивание.

О комментарии выше относительно XSRF 1-часовой токен; В ответ сервер возвращает Set-Cookie. Может случиться так, что почтальон использует это как cookie для второго запроса времени, и именно поэтому он работает для него снова и снова. Вы можете попробовать добавить -H "Cookie: XSRF=b29bd143-cc80-49ad-b495-711125678o" в конце вашего завитка и посмотреть, не имеет значения.

Все это дикое предположение. Лучше добавьте код на стороне сервера, который может печатать заголовки запросов. Затем сделайте два запроса: от завитка и другое от почтальона. После этого проверьте разницу между заголовками запроса. Это даст вам некоторое представление.

+0

Спасибо за предложения! Я попробую их завтра и ответьте, если это поможет – lenach87

+0

К сожалению, эти два заголовка не помогли: (Но я попробую, как вы предложил с добавлением кода, а затем проверил разницу в заголовках запросов – lenach87

-1

Без дополнительной информации по серверному коду я тоже не уверен. Если вы делаете свой звонок из cURL, а не Postman, вам действительно нужен заголовок Postman-Token? Возможно, это сработает, если вы удалите «H» Postman-Token: 76a7a43b-f407-15a2-aaff-5242b44d0f47 »из кода.

curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "[email protected]:\Downloads\hello-world.zip" "http://host:port/api/import" 
+0

Спасибо за комментарий, я тоже пробовал без этого токена - не повезло – lenach87

0

Как уже упоминалось в этой post, добавьте следующие опции

--cookie "csrftoken=XXXXXX;sessionid=YYYYYYY" 

вместе с

-H "X-CSRFToken: XXXXX" 

 Смежные вопросы

  • Нет связанных вопросов^_^