Python SOAP客户端,带有suds的WSDL调用给出了针对HTTP基本身份验证的未经授权的传输错误401


问题内容

背景

我正在使用python 2.7.3构建一个SOAP客户端,并使用Canonical提供的suds 0.4.1库。服务器正在通过HTTPS使用基本身份验证。

问题

无法通过服务器上的认证,甚至无法获得WSDL。我收到以下错误:

suds.transport.TransportError:HTTP错误401:未经授权

尝试解析和编码

我已经尝试了suds文档中描述的两种身份验证方法,但是仍然在上面得到错误消息client = Client(url, ...)。我已经确认了凭据和可以在网络浏览器中进行连接的功能,可以正常工作。

声明之后wsdl_urlusernamepassword,我想:

client = Client(url=wsdl_url, username=username, password=password)

# as well as:

t = HttpAuthenticated(username=username, password=password)
client = Client(url=wsdl_url, transport=t)

# and even:

t = HttpAuthenticated(username=username, password=password)
t.handler = urllib2.HTTPBasicAuthHandler(t.pm)
t.urlopener = urllib2.build_opener(t.handler)
client = Client(url=wsdl_url, transport=t)

最后一个问题似乎至少是从WSDL
URL得到的,这是另一个关于使用suds进行HTTP身份验证的问题

其他注意事项

这个问题不同于这个类似的问题,因为我正在使用:

from suds.transport.https import HttpAuthenticated
# not:
# from suds.transport.http import HttpAuthenticated

从Traceback,该client = Client(url, ...)呼叫显然会到达suds.transport.https.py:

File "/usr/lib/python2.7/dist-packages/suds/client.py", line 112, in __init__ self.wsdl = reader.open(url)
File "/usr/lib/python2.7/dist-packages/suds/reader.py", line 152, in open d = self.fn(url, self.options)
File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 136, in __init__ d = reader.open(url)
File "/usr/lib/python2.7/dist-packages/suds/reader.py", line 79, in open d = self.download(url)
File "/usr/lib/python2.7/dist-packages/suds/reader.py", line 95, in download fp = self.options.transport.open(Request(url))
File "/usr/lib/python2.7/dist-packages/suds/transport/https.py", line 60, in open return  HttpTransport.open(self, request)
File "/usr/lib/python2.7/dist-packages/suds/transport/http.py", line 64, in open raise TransportError(str(e), e.code, e.fp)

我想念什么?


问题答案:

suds并未将授权标头添加到请求中,因此我手动进行了设置:

import base64

# code excluded for brevity

base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
authenticationHeader = {
    "SOAPAction" : "ActionName",
    "Authorization" : "Basic %s" % base64string
}
client = Client(url=wsdl_url, headers=authenticationHeader)