У меня есть скрипт Python, который должен получать доступ к различным веб-API с нашего сервера через Интернет. Проблема в том, что поддержка Python из того, что я видел, довольно слабая, когда дело доходит до поддержки аутентификации NTLM. Это заставляет наш корпоративный прокси-сервер всегда возвращать HTTP-код 407. Моя первоначальная идея заключалась в том, чтобы настроить локальный прокси-сервер с использованием IIS и модуля маршрутизации запросов приложений, который пересылал бы все запросы на наш корпоративный прокси-сервер при обработке аутентификации NTLM. Проблема с этим подходом заключается в том, что он не пересылает мои учетные данные NTLM, из которых текущий пользователь запускает скрипт Python.
Будет ли этот подход работать? Если да, то как я могу это реализовать?
Может быть, немного поздно, но все же хотел об этом упомянуть. Несомненно, наличие поддержки NTLM в вашем сценарии было бы здорово, но это добавило бы сложности и не принесло большой отдачи. Возможно, лучше всего использовать NTLMAps, Cntlm или Px.
NTLMAps и Cntlm - это прокси, которые выполняют NTLM-аутентификацию в качестве промежуточного прокси. Тем не менее, они оба требуют user / pass, поскольку они в основном ориентированы на пользователей Linux. Исторически я использовал эти инструменты в Windows, но меня раздражало одно и то же требование предоставлять им учетные данные и обновлять их каждый раз при изменении моего пароля.
В результате я написал Px для Windows который является HTTP-прокси, подобным двум вышеупомянутым, но использует SSPI для управления необходимой аутентификацией с корпоративным прокси. Все, что вам нужно настроить, это прокси-сервер и порт.
Для разработки собственных приложений код также должен помочь понять, как это сделать в Python и, возможно, на других языках, имеющих доступ к SSPI. Но вы бы предпочли изолировать беспорядок NTLM и не вмешиваться в него.
Я знаю, что это действительно старый вопрос, но все ответы, которые я видел, требуют, чтобы вы вводили свои учетные данные NTLM в какой-то код обработки прокси-сервера NTLM на Python. По моему опыту, эти прокси также подвержены ошибкам. Я создал решение для Windows, которое автоматически обнаруживает конфигурации корпоративной прокси-системы, а также автоматически выполняет аутентификацию NTLM с учетными данными текущего пользователя. Это решение использует вызовы pywin32 и COM. Это некрасиво, но работает хорошо, поэтому я хотел передать его на случай, если он поможет кому-то другому.
В этом примере я показываю, как выполнить POST, но другие типы запросов должны быть легко определены из этого кода:
import win32com.client
try:
import _winreg as winreg
except:
import winreg
class HTTP:
proxy = ""
isProxy = False
def __init__(self):
self.get_proxy()
def get_proxy(self):
oReg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
dwValue = winreg.QueryValueEx(oKey, 'ProxyEnable')
if dwValue[0] == 1:
oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
dwValue = winreg.QueryValueEx(oKey, 'ProxyServer')[0]
self.isProxy = True
self.proxy = dwValue
def url_post(self, url, formData):
httpCOM = win32com.client.Dispatch('Msxml2.ServerXMLHTTP.6.0')
if self.isProxy:
httpCOM.setProxy(2, self.proxy, '<local>')
httpCOM.setOption(2, 13056)
httpCOM.Open('POST', url, False)
httpCOM.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
httpCOM.setRequestHeader('User-Agent', 'whatever you want')
httpCOM.send(formData)
return httpCOM.responseText
http = HTTP()
print(http.url_post('http://ipecho.net/', 'test=1'))