Не удается сохранить ID сессии с помощью curl.

Вопрос или проблема

С запросом:

curl -i -u pvserver:XXXXXXX 'http://192.168.2.42/api/login.json'

У меня есть следующий вывод:

{"salt":"uTxYWQDc9lWwsuHBRfkuTzJYG5M=","session":{"sessionId":2748768190,"roleId":0},"status":{"code":0}}

Теперь я хочу отправить следующий запрос на сервер:

curl -X POST  \
  'http://192.168.2.42/api/dxs.json?' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'accept-encoding: gzip, deflate' \
  -H 'accept-language: en-US,en;q=0.9' \
  -H 'authorization: Basic cHZzZXJ2ZXI6VjZUNUJYSDI=' \
  -H 'cache-control: no-cache' \
  -H 'content-type: text/plain' \
  -H 'cookie: language=en_GB' \
  -H 'origin: http://192.168.2.42' \
  -H 'referer: http://192.168.2.42/' \
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.98 Chrome/71.0.3578.98 Safari/537.36' \
  -b language=en_GB \
  -d '{"dxsEntries":[{"dxsId":33556247,"value":95}]}'

который будет работать только в случае, если я включу полученный ID сессии, но я не могу скопировать и вставить ID, так как это автоматический процесс, часть сценария, работающего каждые 6 секунд и получающего данные “value” с другого сервера.

Я пробовал параметры curl -c и -b, но, как мне кажется, они не работают, так как, согласно инструменту разработки браузера, ID сессии приходит как cookie.

Я решил эту проблему.
Аутентификация в первом POST отправляется в виде данных.
Два curl запроса:

curl -X POST \
  'http://192.168.2.42/api/login.json?sessionId=xxxxxxxxxx' \
   -H 'accept: application/json, text/plain, */*' \
   -H 'cache-control: no-cache' \
   -H 'content-type: application/json' \
   -H 'origin: http://192.168.2.42' \
   -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, как Gecko) Ubuntu Chromium/73.0.3683.75 Chrome/73.0.3683.75 Safari/537.36' \
   -d '{"mode":2,"userId":"xxxxxxx_x","pwh":"xxxxxxxxxxxxxxxxxxxxxxxxxx="}'

и

curl -X POST \
  'http://192.168.2.42/api/dxs.json?sessionId=xxxxxxxxx' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json;charset=UTF-8' \
  -H 'origin: http://192.168.2.42' \
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, как Gecko) Ubuntu Chromium/73.0.3683.75 Chrome/73.0.3683.75 Safari/537.36' \
  -d '{"dxsEntries":[{"dxsId":33556252,"value":3},{"dxsId":33556249,"value":50},{"dxsId":83888896,"value":1},{"dxsId":83888640,"value":true},{"dxsId":33556484,"value":false},{"dxsId":33556239,"value":0},{"dxsId":33556240,"value":82800},{"dxsId":33556247,"value":95}]}'

Оба были получены копированием как Curl, используя инструмент разработки браузера при клике по соответствующим страницам UI.
Сохранение таким образом полученных значений sessionId, userId и pwh гарантирует, что команды продолжат работать. sessionId должен быть одинаковым в обоих запросах POST.
Также оказалось, что во втором запросе POST я должен был отправить все строковые значения, а не только те, которые необходимо обновить.

Основной способ поддержания состояния сессии — использование cookie:

curl -d '...' -b ~/.cache/mycurl.cookiejar -c ~/.cache/mycurl.cookiejar ...

Затем вы можете убрать некоторые заголовки, которые больше не нужны

Ответ или решение

Конечно, давайте рассмотрим проблему более подробно. Ситуация, с которой вы столкнулись, связана с управлением сессией и использованием cookie-файлов для сохранения состояния сеанса при взаимодействии с API посредством команды curl.

Теория

Когда вы делаете запросы к API, важно сохранять состояние сеанса между запросами, особенно если это требует аутентификации. В данном случае, при первом запросе API возвращает sessionId, который необходимо использовать в последующих запросах для идентификации в контексте сессии. Обычно это достигается посредством использования cookie-файлов, которые автоматизируют передачу идентификаторов сеанса между клиентом и сервером.

Команда curl имеет встроенные функции для работы с cookie, позволяя сохранять их в файл и использовать их из файла. Опции -b и -c служат именно этой цели. Опция -b <file> указывает, где взять cookie, а -c <file> указывает, куда их сохранить. Если оба параметра указывают на один и тот же файл, это, по сути, позволяет использовать и обновлять cookie между запросами.

Пример

Чтобы лучше понять, как это работает, представьте, что у нас есть три основных шага в процессе аутентификации и последующих запросах с использованием session ID:

  1. Получение session ID:
    Вам требуется выполнить аутентификационный запрос к API, чтобы получить sessionId. В примере, к которому вы обратились, это делается командой:

    curl -i -u pvserver:XXXXXXX 'http://192.168.2.42/api/login.json'

    Такой запрос возвращает JSON ответ, из которого необходимо извлечь sessionId.

  2. Автоматизация использования session ID:
    Проблема возникает, когда надо включить полученный sessionId в последующие запросы. Если это часть автоматизированного скрипта, необходимо извлечь и сохранить этот ID программно. Один из методов — использование cookie, как упоминалось ранее.

    Пример c использованием cookie:

    # Сохранение сессии после аутентификации
    curl -i -u pvserver:XXXXXXX -c ~/.cache/mycurl.cookiejar 'http://192.168.2.42/api/login.json'

    Использование ранее сохраненной сессии в последующем запросе

    curl -X POST -b ~/.cache/mycurl.cookiejar ‘http://192.168.2.42/api/dxs.json?’ -d "{\"dxsEntries\":[{\"dxsId\":33556247,\"value\":95}]}"

    
    
    Обратите внимание, как файл `~/.cache/mycurl.cookiejar` используется для передачи cookie в последующих запросах.
  3. Конфигурация и выполнение запроса:
    Убедитесь, что ваш запрос корректно включает все необходимые заголовки и данные. Например, content-type должен соответствовать типу данных, передаваемых в -d.

Применение

В вашем случае было найдено, что передача данных аутентификации в теле POST-запроса решает проблему. Этот подход может быть более подходящим, особенно если вы управляете несколькими сессиями и не хотите полагаться на управление сеансом через cookie. Такой подход часто предпочтителен в безопасных средах, где эксплицитное управление аутентификацией необходимо и cookies могут быть нежелательны.

Вы также упомянули важность обеспечения того, чтобы все значения в запросе были корректно указаны и совместимы с ожидаемыми сервером форматами. Это может быть критично для успешной обработки запроса сервером.

Заключение

Использование curl для выполнения автоматизированных аутентифицированных запросов к API может быть сложной задачей, особенно когда необходимо управлять состоянием сеансов. Правильная конфигурация, понимание работы cookie и аутентификации по session ID’ам — ключевые навыки для успешного решения подобных задач. Важно помнить, что различные API могут иметь свои специфические требования, и всегда стоит изучать документацию к API для понимания того, какие методики аутентификации и передачи данных предпочтительны в каждом конкретном случае.

Опишите, что это критически важно применительно к постановке задачи, так как в реальных условиях часто требуется более динамичное и гибкое управление сеансами. Это подчеркивает важность глубокого понимания концепций управления сеансом и применения их в оперативной работе.

Оцените материал
Добавить комментарий

Капча загружается...