2012-02-20 5 views
15

मैं वेब सेवा से जानकारी प्राप्त करने का प्रयास करता हूं जो पासवर्डटेक्स्ट WSS प्रकार का उपयोग करता है। सबसे पहले, मैंने साबुनयूआई का उपयोग करके इसका परीक्षण किया और सफलतापूर्वक डेटा प्राप्त किया। तब मैं जावा पर प्रमाणीकरण लागू किया, SecurityHandler लेखन:SOAPFaultException "हेडरर्स (ओएसिस-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; 
} 

... 
} 

मैं XMLUtils.PrettyDocumentToString(doc) साथ डॉक वस्तु जांच की और देखा, यह देखने के लिए कि पसंद एक्सएमएल soupUI द्वारा भेजे गए - सभी प्रमाणीकरण जानकारी (प्रवेश, पासवर्ड, अस्थायी रूप से और बनाया समय) पर थे जगह, Security टैग की विशेषता को सही समझा जाना चाहिए।

javax.xml.ws.soap.SOAPFaultException:

तो मैं त्रुटि का सामना करना पड़ से [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd} सुरक्षा] नहीं समझा गया है

मैं सलाह दूर करने के लिए मिल गया mustUnderstand विशेषता: हेडर MustUnderstand Security टैग, लेकिन यह मदद नहीं करता है। आपके पास कोई विचार है?

पीएस

वेब सेवा एंडपॉइंट HTTPS पर है। डबल्यूएसडीएल से

नीति हिस्सा:

<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 अनुरोध:

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

मेरा अनुरोध:

<?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> 

उत्तर

7

मैं समाधान मिल गया। बाद निर्भरता की जरूरत थी:

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

इस विषय पर अच्छा लेख और CXF के कुछ नुकसान: http://www.logicsector.com/java/how-to-create-a-wsdl-first-soap-client-in-java-with-cxf-and-maven/

+0

मैं इस कोशिश की और निम्नलिखित अपवाद मिल गया होता है बनाने: 'सर्वलेट/परीक्षण फेंक दिया लोड() अपवाद java.lang.ClassCastException: test.TestServiceListener javax.servlet पर नहीं डाला जा सकता है। सर्लेट ' – Jono

+1

कारण और न ही समाधान समझ में आया है। कॉपी पेस्ट और यह काम करता है। इसे प्यार करना। ;) – iTake

13

आपको यह त्रुटि मिल सकता है जब सेवा हेडर संभाल नहीं करता है। सेवा को एक SOAPHandler को getHeaders() के साथ कार्यान्वित करने की आवश्यकता है जो हेडर को हल करेगी। ऊपर उल्लेख गलती सही कार्यान्वयन के रूप में

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

यह भी इस पाने के लिए जब सेवा वास्तव में सुरक्षित नहीं है संभव है, लेकिन ग्राहक सुरक्षा विन्यास का उपयोग करने के प्रयास कर रहा है इस प्रकार होगा के लिए (संभवतः एक XWSS सुरक्षा का उपयोग विन्यास) इसके लिए सिर्फ एक ब्राउज़र से प्रकाशित wsdl की जाँच करें और सुनिश्चित करें कि यह अपने अंतिम बिंदु यूआरएल के लिए उम्मीद सुरक्षा नीति (संलग्न WSDL)

संबंधित मुद्दे