2012-01-02 4 views
5

SUDS를 사용하려고하는데 왜 인증 (또는 https)을받을 수 없는지 파악하려고 노력했습니다.Python SUDS https 서비스 401에 대한 SOAP 요청

액세스하려는 서비스가 기본 다이제스트 인증을 사용하는 https를 초과합니다. 디버그를 기반으로 https 대신 http를 사용하는 것으로 보입니다. 그러나 내가 무엇을 놓치고 있는지 정말로 알지 않는다. 어떤 단서가 인정됩니다.

from suds.client import Client 
from suds.transport.http import HttpAuthenticated 
import logging 
logging.basicConfig(level=logging.DEBUG) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG) 
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG) 

def main(): 
    url = 'https://blah.com/soap/sp/Services?wsdl' 
    credentials = dict(username='xxxx', password='xxxx') 
    t = HttpAuthenticated(**credentials) 
    client = Client(url, location='https://blah.com/soap/sp/Services', transport=t) 
    print client.last_sent() 

if __name__=="__main__": 
    main() 

디버그 출력 :

DEBUG:suds.wsdl:reading wsdl at: https://blah.com/soap/sp/Services?wsdl ... DEBUG:suds.transport.http:opening (https://blah.com/soap/sp/Services?wsdl)
snip ...
File "C:\Python27\Lib\site-packages\suds-0.4-py2.7\suds\reader.py", line 95, in download
fp = self.options.transport.open(Request(url))

File "C:\Python27\Lib\site-packages\suds-0.4-py2.7\suds\transport\http.py", line 173, in open
return HttpTransport.open(self, request)

File "C:\Python27\Lib\site-packages\suds-0.4-py2.7\suds\transport\http.py", line 64, in open
raise TransportError(str(e), e.code, e.fp)

suds.transport.TransportError: HTTP Error 401: Authorization Required

+0

먼저 ... 그냥하지 '인증 소화'해야한다 '인증을 기본 소화를.' 승인 유형은 '다이제스트'및 '기본'입니다. 그래서 혼란 스러웠습니다. – user9303

답변

6

배트 두 HttpAuthenticated 클래스는 하나 suds.transport.http 모듈과 모듈 suds.transport.https 제를 제공한다. suds.transport.http에서 인스턴스가 생성되지만 URL이 https://이므로 suds.transport.https.HttpAuthenticated을 시도해 볼 수 있습니다.

+0

+1. 'suds.transport.https.HttpAuthenticated'는 suds의 문서에 없습니다. 귀하의 솔루션은 내 문제에 대한 해답이었습니다. –

5

나는이 문제를 발견하고 저를 위해 작동하는 해결책을 찾아 냈습니다. 내 서버가 NTLM 인증을 사용 중이므로 suds을 사용하려면 documentation의 "Windows (NTLM)"섹션을 따라야합니다.

먼저 python-ntlm를 설치 한 다음 당신은 쓸 수 있습니다 : 정확성에 대한

from suds.transport.https import WindowsHttpAuthenticated 
ntlm = WindowsHttpAuthenticated(username='xx', password='xx') 
client = Client(url, transport=ntlm)