10

バックグラウンド

Python 2.7.3でSOAPクライアントを構築し、Canonicalが提供するsuds0.4.1ライブラリを使用しています。サーバーはHTTPS経由の基本認証を使用しています。

問題

WSDLを取得する場合でも、サーバーで認証を渡すことはできません。次のエラーが発生します。

suds.transport.TransportError:HTTPエラー401:無許可

解決とコードの試み

sudsのドキュメントに記載されている両方の認証方法を試しましたが、それでも上記のclient = Client(url, ...)行でエラーが発生します。クレデンシャルとWebブラウザで接続する機能を確認しました。これは正常に機能します。

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

最後の1つは、少なくとも、 sudsを使用したHTTP認証に関する別の質問でWSDLURLから応答を取得しているようです。

その他の注意事項

私が使用しているので、この質問はこの同様の質問とは異なります。

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)

私は何が欠けていますか?

4

2 に答える 2

11

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)
于 2012-08-28T16:00:56.763 に答える
0

SOAPpyを使用できます

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
  ...
于 2014-02-13T18:55:52.573 に答える