Python SOAP客户端,使用suds的WSDL调用为HTTP基本身份验证提供未经授权的传输错误401 背景

Python SOAP客户端,使用suds的WSDL调用为HTTP基本身份验证提供未经授权的传输错误401 背景,python,soap,wsdl,basic-authentication,suds,Python,Soap,Wsdl,Basic Authentication,Suds,我正在用Python2.7.3构建一个SOAP客户机,并使用Canonical提供的suds 0.4.1库。服务器正在通过HTTPS使用基本身份验证 问题 无法在服务器上通过身份验证,甚至无法获取WSDL。我得到以下错误: suds.transport.TransportError:HTTP错误401:未经授权 解析和编码的尝试 我已经尝试了中描述的两种身份验证方法,但仍然在client=client(url,…)行中出现上述错误。我已经确认了在网络浏览器中进行连接的凭据和能力,这很好 在声明了

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

问题 无法在服务器上通过身份验证,甚至无法获取WSDL。我得到以下错误:

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

解析和编码的尝试 我已经尝试了中描述的两种身份验证方法,但仍然在
client=client(url,…)
行中出现上述错误。我已经确认了在网络浏览器中进行连接的凭据和能力,这很好

在声明了
wsdl\u url
username
password
之后,我尝试:

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获得了响应

其他注释 此问题与此不同,因为我使用:

from suds.transport.https import HttpAuthenticated
# not:
# from suds.transport.http import HttpAuthenticated
从回溯来看,
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)
你可以用肥皂

import SOAPpy, base64

class myHTTPTransport(SOAPpy.HTTPTransport):
    username = None
    passwd = None

    @classmethod
    def setAuthentication(cls,u,p):
        cls.username = u
        cls.passwd = p

    def call(self, addr, data, namespace, soapaction=None, encoding=None, http_proxy=None, config=SOAPpy.Config, timeout=None):

        if not isinstance(addr, SOAPpy.SOAPAddress):
          addr = SOAPpy.SOAPAddress(addr, config)

        if self.username != None:
          addr.user = self.username+":"+self.passwd

        return SOAPpy.HTTPTransport.call(self, addr, data, namespace, soapaction, encoding, http_proxy, config)


if __name__ == '__main__':

  # code for authenticating the SOAP API calls
  myHTTPTransport.setAuthentication('admin', 'admin')

  # Getting the instance of Server
  Baton = SOAPpy.WSDL.Proxy(<WSDL PATH>, transport=myHTTPTransport)

  # your code goes here
  ...
导入SOAPpy,base64
类myHTTPTransport(SOAPpy.HTTPTransport):
用户名=无
passwd=None
@类方法
def设置身份验证(cls、u、p):
cls.username=u
cls.passwd=p
def调用(self,addr,data,namespace,soapaction=None,encoding=None,http_proxy=None,config=SOAPpy.config,timeout=None):
如果不存在(地址,SOAPpy.SOAPAddress):
addr=SOAPpy.SOAPAddress(addr,config)
如果self.username!=无:
addr.user=self.username+“:”+self.passwd
返回SOAPpy.HTTPTransport.call(self、addr、数据、命名空间、soapaction、编码、http_代理、配置)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#用于验证SOAP API调用的代码
myHTTPTransport.setAuthentication('admin','admin'))
#获取服务器的实例
Baton=SOAPpy.WSDL.Proxy(,transport=myHTTPTransport)
#你的密码在这里
...

+1,用于解释清楚的问题。我们能看看完整的追踪结果吗?另外,如果这听起来像是在光顾,很抱歉,但是您确定您使用的用户名和密码正确吗service@olly_uk我添加了更多的追踪。根据我使用的
client=client(url=wsdl\u url…
。我确信用户名和密码也有错误,但我将配置文件直接复制粘贴到浏览器中(多次!)以确保绝对正确。使用此方法,我得到了完全相同的401:未经授权的问题:(不知道为什么选择这个作为答案。我仍然面临着完全相同的401:未经授权的错误,即使在base64编码之后也是如此:正如用户@SomeguyonComputer所提到的