Я месяцами пользовался REST API для веб-сайта с библиотекой Python requests
без проблем. Это в частной сети, которую я не могу контролировать. Это также требует аутентификации сертификата клиента, поэтому вызов выглядит примерно так:
r = requests.get('https://example.com/some/endpoint?param=something', cert=(key_path, cert_path), verify=ca_path)
После проверки запроса я смог убедиться, что сервер изначально отвечает с кодом перенаправления 302
на другой URI на сервер для установки аутентификации cook ie, а затем перенаправляет обратно на ресурс, который я запрашивал, который затем успешно выполняется. Hakuna matata.
Мы работаем над новым NodeJS серверным компонентом и пытаемся подключить его к той же конечной точке. Я пробовал с несколькими разными библиотеками, и все они получают идентичные результаты. Вот пример одной из моих попыток использовать популярную библиотеку got
с tough-cookie CookieJar
:
let opts = {
key: fs.readFileSync(keyPath),
cert: fs.readFileSync(certPath),
ca: [fs.readFileSync(caPath)],
cookieJar: new CookieJar()
}
// Using Promise API here because I'm running on an older version of NodeJS which
// unfortunately doesn't have async/await :(
got('https://example.com/some/endpoint?param=something', opts).then((res) => {
// ...
});
Странно, но сервер отвечает 200
код и HTML страница, которая в основном говорит (и я перефразирую, конечно):
"Вы, похоже, потеряли информацию о сеансе, чувак. Возможно, ваш браузер перезапустился после установка плагина или что-то в этом роде. "
В него встроены ссылки на страницу входа на сайт. К сожалению, я не могу скопировать и вставить вывод, потому что все в закрытой частной сети.
Я не могу на всю жизнь выяснить , почему этот сервер (что указывает заголовки ответа) является Apache сервером), будет отвечать по-разному на HTTP-запрос узла по сравнению с Python. Я даже изменил заголовки HTTP-запросов для вызовов requests
и got
, чтобы они были абсолютно идентичными, но безрезультатно. всегда работает для Python, а никогда не работает для узла.
Это не имеет смысла для меня. Кто-нибудь знаком с библиотекой Python requests
и модулем Node HTTP
, кто может определить тонкие различия в способе подключения к серверу, который может вызывать эту проблему? Очевидно, что сервер способен различать guish между двумя запросами, даже если заголовки идентичны. У кого-нибудь, кто знаком с Apache, есть какие-нибудь идеи или вещи, которые можно найти, чтобы пролить свет на проблему?
В случае ее актуальности мы используем Python v3.6 и Node v8.x (Не могу вспомнить, какая именно дополнительная версия ... и, к сожалению, я не могу получить доступ к машине в данный момент, обновлю позже)
Есть предложения? Что еще я могу попытаться, чтобы запросы успешно выполнялись в Node, как они делают в Python?