2012-02-20 31 views
15

Intento obtener información del servicio web que utiliza el tipo de contraseña de WSS. En primer lugar, lo pruebo con soapUI y obtuve datos con éxito. A continuación, he implementado la autenticación en Java, la escritura SecurityHandler:SOAPFaultException "No se entienden los encabezados de MustUnderstand (oasis-200401-wss-wssecurity-secext-1.0.xsd)"

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; 
} 

... 
} 

he comprobado objeto doc con XMLUtils.PrettyDocumentToString(doc) y vi, que le gusta mirar XML enviado por soupUI - toda la información de autenticación (login, contraseña, nonce y hora de creación) estaban en lugar, debe interpretar atributo de Security etiqueta era verdadera.

Entonces se enfrentaron con error:

javax.xml.ws.soap.SOAPFaultException: mustUnderstand encabezados: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd} seguridad] no se comprenden

he encontrado información para eliminar mustUnderstand atributo de Security etiqueta, pero no ayuda. ¿Tienes alguna idea?

P.S.

El punto final del servicio web está en HTTPS.

parte Política 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> 

solicitud soapUI:

<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>[email protected]</ns:email> 
      <ns:firstName/> 
      <ns:lastName/> 
     </ns:RetrieveCustomerByEmail> 
    </soapenv:Body> 
</soapenv:Envelope> 

Mi solicitud:

<?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>[email protected]</ns5:email> 
      <ns5:firstName/> 
      <ns5:lastName/> 
     </ns5:RetrieveCustomerByEmail> 
    </S:Body> 
</S:Envelope> 

Respuesta

7

he encontrado la solución. Se requiere que las dependencias siguientes:

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-frontend-jaxws</artifactId> 
    <version>2.2.3</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-transports-http</artifactId> 
    <version>2.2.3</version> 
</dependency> 

Buen artículo sobre este tema y algunas trampas de cxf: http://www.logicsector.com/java/how-to-create-a-wsdl-first-soap-client-in-java-with-cxf-and-maven/

+0

probé esto y tengo la siguiente excepción:? 'servlet/prueba arrojó Excepción load() java.lang.ClassCastException: test.TestServiceListener no se puede convertir a javax.servlet.Servlet' – Jono

+1

no han entendido la causa ni la solución. copia pegada y funciona. quiéralo. ;) – iTake

13

Usted podría conseguir este error cuando el servicio no se ocupa de las cabeceras. El servicio necesita implementar un manejador SOAP con un getHeaders() que resolvería los encabezados. para el fallo mencionado anteriormente la aplicación correcta sería la siguiente

@Override 
    public Set<QName> getHeaders() { 
     QName securityHeader = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", 
       "Security"); 
     HashSet<QName> headers = new HashSet<QName>(); 
     headers.add(securityHeader);   
     return headers; 
    } 

También es posible conseguir esto cuando el servicio es en realidad no es seguro, pero el cliente está intentando utilizar la configuración de seguridad (posiblemente usando una seguridad XWSS configuración) para ello, basta con comprobar el WSDL publicado desde un navegador y asegúrese de que contiene la política esperada de seguridad (se añade WSDL a su URL de punto final)

Cuestiones relacionadas