2012-01-02 48 views
5

Estoy intentando usar SUDS y estoy atascado tratando de descubrir por qué no puedo lograr que funcione la autenticación (o https).Python SUDS Solicitud SOAP al servicio https 401

El servicio al que intento acceder tiene más de https con autenticación resumida básica. Basado en los errores, parece estar usando http en lugar de https. Pero no estoy seguro de lo que me estoy perdiendo. Cualquier pista es apreciada.

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() 

de depuración de salida:

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

En primer lugar por la corrección ... Debe ser sólo 'autenticación Digest' no 'básica autenticación implícita. Los tipos de autenticación son: 'digest' y 'basic'. Entonces estaba confundido – user9303

Respuesta

6

Suds proporciona dos HttpAuthenticated clases, una en el módulo suds.transport.http y el segundo en el módulo suds.transport.https. Parece que su instancia de suds.transport.http, sin embargo, dado que su URL es https://, es posible que desee intentar suds.transport.https.HttpAuthenticated.

+0

+1. 'suds.transport.https.HttpAuthenticated' no estaba en el documento de suds. Tu solución fue la respuesta a mi problema. –

5

Me encontré con este problema y encontré una solución que funciona para mí. Mi servidor utilizaba la autenticación NTLM, así que para que suds trabaje con él, solo tenía que seguir la sección "Windows (NTLM)" en el documentation.

Primero instale python-ntlm, y luego se puede escribir:

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