gSOAP WSSE Header xmlns mancanti dichiarazioni di namespace
-
26-10-2019 - |
Domanda
Ho un problema che genera un colpo di testa di sicurezza gSOAP (WSSE). Ho compilato tutti i file necessari e utilizzati i seguenti chiamate per aggiungere l'intestazione di protezione WSSE alla richiesta:
soap_wsse_add_Security(proxy.soap);
soap_wsse_add_UsernameTokenText(proxy.soap, "UsernameToken-1", "user","passwd");
La mia intestazione di protezione viene fuori cercando in questo modo:
<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:mustUnderstand="true">
<wsse:UsernameToken wsu:Id="UsernameToken-1">
<wsse:Username>testuser</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
testPassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
Rispetto alle specifiche del server mi è stato fornito, la riga
<wsse:Security SOAP-ENV:mustUnderstand="true">
manca xmlns: wsse = "http ...." e la linea
<wsse:UsernameToken wsu:Id="UsernameToken-1">
manca il xmlns: wsu = "http ...." parti. Quindi voglio il a guardare in questo modo:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="true">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1">
Come faccio ad aggiungere i xmlns: wsse e xmlns: parti WSU alle linee specifiche per essere in linea con le specifiche? L'errore che ottengo dal servizio è:
com.ctc.wstx.exc.WstxParsingException: Undeclared namespace
prefix "wsse"
Ho guardato la documentazione gSOAP ma tutto quello che ho trovato è stato come aggiungere un colpo di testa, nulla su come aggiungere le definizioni degli spazi dei nomi agli elementi nell'intestazione.
L'assistenza sarà apprezzato.
Soluzione 2
Proprio rispondendo alla domanda per chiuderla.
Quello che dovete fare è quello di modificare il file * .nsmap. C'è possibile aggiungere le definizioni di namespace nella struct per esempio:
SOAP_NMAC struct Namespace ZamtelWSZambia_namespaces[] =
{
{"wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-ecext-1.0.xsd", NULL, NULL},
{NULL, NULL, NULL, NULL}
};
Poi nel client è sufficiente includere il NSMAP in questo modo:
#include "soapstubs/XXXX.nsmap"
Altri suggerimenti
In realtà, non si deve modificare il file .nsmap, ma piuttosto la typemap.dat, che colpisce la generazione automatica di .nsmap.
Usa WS \ WS-typemap.dat come base (definisce già namespace WS-SE) e di fornire come argomento per il comando wsdl2h:
wsdl2h -t WS-typemap.dat ...