SOAPFaultException “MustUnderstand les en-têtes (oasis-200401-wss-wssecurity-secext-1.0.xsd) ne sont pas compris”
J'essaie d'obtenir des informations à partir du service web qui utilise PasswordText WSS type. Tout d'abord, je l'ai tester à l'aide de soapUI et avec succès obtenu des données. Puis j'ai mis en place l'authentification sur Java, l'écriture SecurityHandler:
public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> {
...
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
boolean outInd = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outInd) {
try {
WSSecUsernameToken builder = new WSSecUsernameToken();
builder.setPasswordType(WSConstants.PASSWORD_TEXT);
builder.setUserInfo(_username, _password);
builder.addNonce();
builder.addCreated();
Document doc = messageContext.getMessage().getSOAPPart().getEnvelope().getOwnerDocument();
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
builder.build(doc, secHeader);
} catch (Exception e) {
LOGGER.error("Unable to handle SOAP message", e);
return false;
}
}
return true;
}
...
}
J'ai vérifié doc objet avec XMLUtils.PrettyDocumentToString(doc)
et vu qu'il aime regarder XML envoyé par soupUI - toutes les informations d'authentification (login, mot de passe, nonce et date de création) étaient sur place, mustUnderstand attribut de Security
balise était vrai.
Puis j'ai fait face avec l'erreur:
javax.xml.ws.le savon.SOAPFaultException: MustUnderstand en-têtes:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Sécurité] ne sont pas compris
J'ai trouvé des conseils pour supprimer l'attribut mustUnderstand de Security
tag, mais il n'est pas utile. Avez-vous des idées?
P. S.
De terminaison de service Web est sur HTTPS.
Partie politique à partir de WSDL:
<wsp:Policy wsu:Id="BasicHttpBinding_RelateService_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding>
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedSupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedSupportingTokens>
<sp:Wss10>
<wsp:Policy/>
</sp:Wss10>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
soapUI demande:
<soapenv:Envelope xmlns:ns="http://api.example.com/RelateService/1.0"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-37"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>username</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
password
</wsse:Password>
<wsse:Nonce
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
li/0YK2wxrmrHL7Cg+etdQ==
</wsse:Nonce>
<wsu:Created>2012-02-21T08:59:10.262Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ns:RetrieveCustomerByEmail>
<ns:email>xxx@example.com</ns:email>
<ns:firstName/>
<ns:lastName/>
</ns:RetrieveCustomerByEmail>
</soapenv:Body>
</soapenv:Envelope>
Ma demande:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
S:mustUnderstand="1">
<wsse:UsernameToken wsu:Id="UsernameToken-1">
<wsse:Username>username</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
password
</wsse:Password>
<wsse:Nonce
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
+jeleKO9zr0/wLjAIYcmSg==
</wsse:Nonce>
<wsu:Created>2012-02-21T09:42:03.760Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</S:Header>
<S:Body>
<ns5:RetrieveCustomerByEmail xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:ns2="http://schemas.datacontract.org/2004/07/XXX.Service"
xmlns:ns3="http://schemas.datacontract.org/2004/07/XXX.Service.Relate.Contract"
xmlns:ns4="http://schemas.datacontract.org/2004/07/XXX.Service.Dto"
xmlns:ns5="http://api.example.com/RelateService/1.0"
xmlns:ns6="http://schemas.microsoft.com/2003/10/Serialization/">
<ns5:email>xxx@example.com</ns5:email>
<ns5:firstName/>
<ns5:lastName/>
</ns5:RetrieveCustomerByEmail>
</S:Body>
</S:Envelope>
OriginalL'auteur Marboni | 2012-02-20
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir ce message d'erreur lorsque le service ne gère pas les en-têtes. Le service a besoin pour mettre en œuvre un SOAPHandler avec un getHeaders() qui permettrait de résoudre les en-têtes.
Pour le ci-dessus mentionné faute de la mise en œuvre correcte serait comme suit
Il est également possible d'obtenir cette lorsque le service n'est pas réellement en sécurité, mais le client tente d'utiliser la configuration de sécurité (éventuellement à l'aide d'un XWSS configuration de la sécurité)
Pour cela, il suffit de cocher la publication wsdl à partir d'un navigateur et assurez-vous qu'il contient attendus de la politique de sécurité (ajouter ?wsdl pour son URL du point de terminaison)
OriginalL'auteur Joseph Rajeev Motha
J'ai trouvé la solution. Dépendances suivantes:
Bon article sur ce sujet et quelques pièges de cxf: http://www.logicsector.com/java/how-to-create-a-wsdl-first-soap-client-in-java-with-cxf-and-maven/
Servlet /test threw load() exception java.lang.ClassCastException: test.TestServiceListener cannot be cast to javax.servlet.Servlet
n'ont pas compris la cause ni la solution. copier collé et ça fonctionne. l'amour c'. 😉
OriginalL'auteur Marboni
Voici ce qui a fonctionné pour moi. En gros, c'est une application de l'idée prononcée par @Joseph Rajeev Motha (bien que je l'ai trouvé ailleurs, ici: https://dwuysan.wordpress.com/2012/04/02/jax-ws-wsimport-and-the-error-mustunderstand-headers-not-understood/#comment-215 ), mais sa réponse ne fournit pas de passe-partout, et sans elle, la réponse est assez mystérieux.
Veuillez noter que cette séquence s'applique à la version autonome de cas (où vous publiez une
Endpoint
vous-même).Étape 1
Créer un
SOAPHandler
pour "comprendre" l'en-tête:Étape 2
Créer un
handler-chain.xml
fichier et le mettre sur le chemin de classe:Étape 3
Annoter la mise en œuvre de la classe (classe est annotée avec
@WebService
) avec une référence à la gestionnaire de la chaîne de fichier:Étape 4
Publier votre point de terminaison:
Une remarque importante
handleMessage()
ethandleFault()
défini par le maître-chien doit revenirtrue
. Sinon, vous recevrez des erreurs étranges comme "Inattendue élément wrapper', car un autre élément wrapper nom sera utilisé.OriginalL'auteur Roman Puchkovskiy