2016-10-18 7 views
1

Основываясь на некотором вопросе SO, который я видел ранее, я использую WinHttpRequest внутри Inno Setup, чтобы сделать запрос GET веб-серверу (localhost:8000 прямо сейчас). Минимальный код ниже, запрос на встроенный сервер отладки Django (python manage.py runserver).WinHttpRequest в Inno Setup не отправляет учетные данные с заголовком Authenticate

procedure InitializeWizard(); 
var 
    WinHttpReq: Variant; 
    url: string; 
    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER: integer; 
begin 
    url := 'http://localhost:8000/odbc/test/'; 
    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER := 0; 

    WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1'); 
    WinHttpReq.Open('GET', url, false); 
    WinHttpReq.SetRequestHeader('Accept','application/json'); 
    WinHttpReq.SetCredentials('username','password',HTTPREQUEST_SETCREDENTIALS_FOR_SERVER); 
    WinHttpReq.Send(); 
    MsgBox(WinHttpReq.Status, mbInformation, MB_OK); 
    MsgBox(WinHttpReq.ResponseText, mbInformation, MB_OK); 
end; 

Это дает мне 403, аутентификационные данные не предоставляются.

Наоборот, этот код в библиотеке запросов Python работает успешно.

>> import requests 
>> r = requests.get('http://localhost:8000/odbc/test/', auth=('username','password')) 
>> r.status_code 
200 

Am I недоразумение как WinHttpRequest объект работает в? Поскольку Wireshark подтверждает, что заголовок Authorization: Basic *hashstring* был отправлен в заголовке с запросами Python, но не в случае WinHttpRequest. Вероятным обходным решением было бы установить заголовок для объекта WinHttpRequest, но мне просто интересно, если я что-то сделаю неправильно.

Gist с пакетными захватами: https://gist.github.com/anonymous/597468ba76b59dae4a8d7809ee1c6feb

Wireshark скриншоты:

WinHttpRequest in Inno Setup Wireshark capture

Python requests library Wireshark capture

+0

работает для меня (на сервере Apache) - 1) Есть ли у вас какие-либо специальные символы в имя пользователя/пароль? 2) Можете ли вы попытаться захватить HTTP-трафик, используя, например, Wireshark, как для кода Inno Setup, так и для кода Python? И разместить их здесь? Или, по крайней мере, журналы веб-серверов для обоих. –

+0

Добавлены скриншоты захвата проводов. Есть ли лучший формат для размещения проводок? –

+0

Когда вы останавливаете захват, вы можете сохранить трафик в файл. Обратите внимание, что 'WinHttpRequest' отправляет два HTTP-запроса. В первый раз, без аутентификации, а затем после получения 401, он отправляет второй запрос с авторизацией. Поэтому нам нужно увидеть оба запроса, включая ответы с сервера. –

ответ

0

Я думаю, что это несовместимость между WinHttpRequest и вашим "отладки сервера Джанго".


WinHttpRequest посылает заголовок Authenticate, только после того, как вызов сервером с заголовком WWW-Authenticate.

В ответе 403 от вашего сервера нет такого заголовка. Следовательно, WinHttpRequest не отправляет заголовок Authorization.

Решения:

  • Сделайте ваш сервер возвращает WWW-Authenticate заголовок (а в идеале статус 401 - хотя это не требует WinHttpRequest).

  • Отправить заголовок Authenticate явно:

    WinHttpReq.SetRequestHeader('Authorization', 'Basic ???'); 
    
+0

Последний метод работает как обходной путь. –

+0

Заголовки ответа отсутствуют в ваших захватах. Во всяком случае, я не думаю, что это необходимо для дальнейшего изучения проблемы. Я считаю, что проблема совершенно ясна. Если мой ответ помог, [подумайте о принятии его] (http://stackoverflow.com/help/someone-answers). –

+0

Можете ли вы пояснить, что вы подразумеваете под заголовками ответов в ваших захватах? Вы имеете в виду, что они не были отправлены сервером отладки django или что я не смог экспортировать их из wirehark? –