2016-10-18 6 views
1

내가 이전에 본 몇 가지 질문에 따라 Inno Setup에서 WinHttpRequest을 사용하여 웹 서버에 GET 요청을합니다 (localhost:8000). 아래의 최소 코드는 내장 Django 디버그 서버 (python manage.py runserver)에 대한 요청입니다.Inno 설치의 WinHttpRequest가 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 

오전 나는 어떻게 WinHttpRequest 객체의 작품을 오해? Wireshark가 Authorization: Basic *hashstring* 헤더를 확인했기 때문에 헤더에 Python 요청이 있지만 WinHttpRequest 사례에는 전송되지 않았습니다. 가능성이있는 해결 방법은 WinHttpRequest 개체의 헤더를 직접 설정하는 것이지만 잘못된 것이 있다면 궁금합니다. 패킷 캡처와

요점 : https://gist.github.com/anonymous/597468ba76b59dae4a8d7809ee1c6feb

와이어 샤크의 스크린 샷 :

WinHttpRequest in Inno Setup Wireshark capturePython requests library Wireshark capture

+0

작품 - 1) 사용자 이름/암호에 특수 문자가 있습니까 :

  • 에 의해 명시 적으로 Authenticate 헤더를 보내기? 2) 예를 들어 HTTP 트래픽을 캡처 할 수 있습니까? Wireshark, Inno Setup 코드와 Python 코드 둘 다? 여기에 게시 하시겠습니까? 적어도 둘 다에 대한 웹 서버 로그. –

  • +0

    wireshark 캡처 ​​스크린 샷을 추가했습니다. wireshark 캡처를 게시하기위한 더 좋은 형식이 있습니까? –

    +0

    캡처를 중지하면 트래픽을 파일에 저장할 수 있습니다. 'WinHttpRequest'는 두 개의 HTTP 요청을 보냅니다. 처음에는 인증을받지 않고 401을 수신 한 후 승인을받은 두 번째 요청을 보냅니다. 따라서 우리는 서버의 응답을 포함하여 두 가지 요청을 모두 볼 필요가 있습니다. –

    답변

    0

    내 생각 엔이이 WinHttpRequest하고 "장고 디버그 서버"간의 비 호환성이 있다는 것이다.


    WinHttpRequestWWW-Authenticate에만 헤더를 서버에 의해 도전시킨 후, Authenticate 헤더를 전송한다.

    서버의 403 응답에는 이러한 헤더가 없습니다. 따라서 WinHttpRequestAuthorization 헤더를 보내지 않습니다.

    솔루션은 다음과 같습니다

    • 는 서버가 WWW-Authenticate 헤더 반환 확인 (이상적으로 401 개 상태 -이이 WinHttpRequest가 필요치 않음). (아파치 서버에 대해) 나를 위해

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

    두 번째 방법은 해결 방법으로 작동합니다. –

    +0

    응답 헤더가 캡처에 없습니다. 어쨌든 문제를 더 이상 조사 할 필요가 없다고 생각합니다. 나는 그 문제가 아주 분명하다고 믿는다. 내 대답이 도움이된다면, [그것을 받아들이는 것을 고려하십시오] (http://stackoverflow.com/help/someone-answers). –

    +0

    '응답 헤더가 캡처에 없습니다'라는 의미를 분명히 할 수 있습니까? django 디버그 서버에 의해 보내지지 않았다는 것을 의미합니까, 아니면 wireshark에서 어떻게 그들을 내보낼 수 없었습니까? –