Python + SOAP + Suds + WSSE + WS Adressing

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
devlg
User
Beiträge: 2
Registriert: Donnerstag 2. Januar 2014, 10:23

Servus liebe Python-Gemeinde,

ich sitze hier gerade an einem Problem, bei welchem ich leider nicht weiter komme und auf Eure Hilfe hoffe. Es geht um einen 'simplen' SOAP-Client, welcher anhand einer Spezifikation in WSDL Form mit WS-Security und WS-Adressing die notwendigen Methoden zur Verfügung stellen soll.

Da Python per Default weder WSSE noch WSA beherrscht, habe ich mich für SUDS entschieden, da ich damit bisher gute Erfahrungen gemacht habe. WSSE funktioniert mit SUDS hervorragend, leider sehe ich aber bzgl. WSA kein Licht am Horizont.

Folgenden Fehler wirft das folgende Script: Server raised fault: 'Error in the Internal configuration.'

Dies liegt 100%ig an dem fehlenden WS Addressing, da dies für den Dienst vorrausgesetzt wird. Mittels SOAPUi habe ich alles geprüft, Dienst funktioniert und die Funktionen werden mir auch zurück geliefert. Leider kann ich diese aber ohne WSA nicht nutzen. Hat jemand von Euch bereits eine Implementierung von WSA+WSSE mittels SUDS geschrieben?

Über Tipps wäre ich sehr dankebar.

Code: Alles auswählen

#!/usr/bin/python2.7
# Imports
import suds
import logging
from suds.client import Client
from suds.wsse import *

# Logging Optionen
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)


# Variablen setzen
WSDL_URL = 'https://webservice.tld/hrb.wsdl'
WSSE_USERNAME = 'username'
WSSE_PASSWORD = 'password'

wsans = ('wsa', 'http://schemas.xmlsoap.org/ws/2004/08/addressing')
#mustAttribute = Attribute('SOAP-ENV:mustUnderstand', 'true')

# URL Detail
client = Client(WSDL_URL)

# WSSE Security
security = Security()
token = UsernameToken(WSSE_USERNAME, WSSE_PASSWORD)
token.setnonce()
token.setcreated()
security.tokens.append(token)
#security.tokens.append(Timestamp())
client.set_options(wsse=security)

# Abfragen
try:
        result = client.service.sammelabruf('nutzer','passwort','parameter1','2013-12-01','2013-12-29','parameter4')
        print result
except suds.WebFault, e:
        print e
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hast du mal

Code: Alles auswählen

client = Client(WSDL_URL, location=WSDL_URL)
in Zeile 25 probiert?

Sieht nach einem HTTPS Problem aus. Ich empfehle dir auch einfach mal in die Debugging Ausgabe zu gucken. Dadurch wird man manchmal auch schlauer.

Grüße,
anogayales
devlg
User
Beiträge: 2
Registriert: Donnerstag 2. Januar 2014, 10:23

anogayales hat geschrieben:Hast du mal

Code: Alles auswählen

client = Client(WSDL_URL, location=WSDL_URL)
in Zeile 25 probiert?
Herzlichen Dank, damit sieht es schon folgendermaßen aus:

Code: Alles auswählen

Server raised fault: 'Error in the Internal configuration.'
Ich musste darüber hinaus den Endpoint auf eine andere URL setzen als die WSDL (klar *facepalm*). Nun fehlt wirklich nurnoch WS Addressing.

# Variablen setzen
WSDL_URL = 'https://webservices.tld/hrb.wsdl'
WSPHP_URL = 'https://webservices.tld/hrb.php'
WSSE_USERNAME = 'wsse-user'
WSSE_PASSWORD = 'wsse-pass'

client = Client(WSDL_URL, location=WSPHP_URL)
Antworten