2017-07-27 2 views
0

Je suis en train de se connecter (sans succès) à ce qui suit WS en utilisant Java:Intégration avec TERYT - service web du gouvernement polonais

J'ai essayé de nous e soapui sans succès. Essayé l'authentification de base et NTLM, et je reçois toujours l'erreur suivante:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/soap/fault</a:Action> 
    </s:Header> 
    <s:Body> 
     <s:Fault> 
     <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:InvalidSecurity</faultcode> 
     <faultstring xml:lang="en-US">An error occurred when verifying security for the message.</faultstring> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

Les instructions officielles pour montre ce service Web exemple suivant pour vous connecter en utilisant C#. Je n'ai pas testé cela, mais je suppose que cela fonctionne correctement.

try { 
    var proxy = new ChannelFactory<ServiceReferenceWCF.ITerytWs1>("custom"); 
    proxy.Credentials.UserName.UserName = login; 
    proxy.Credentials.UserName.Password = haslo; 
    var result = proxy.CreateChannel(); 
    var test = result.CzyZalogowany(); // should return true if connected correctly 
} catch (Exception ex) { } 

Et en dessous du réglage:

<client> 
     <endpoint address="https://uslugaterytws1.stat.gov.pl/TerytWs1.svc" binding="customBinding" bindingConfiguration="custom" contract="ServiceReference1.ITerytWs1" name="custom" /> 
    </client> 
    <bindings> 
     <customBinding> 
     <binding name="custom"> 
      <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport" requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"> 
       <localClientSettings detectReplays="false" /> 
       <localServiceSettings detectReplays="false" /> 
      </security> 
      <textMessageEncoding messageVersion="Soap11WSAddressing10" /> 
      <httpsTransport maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" /> 
     </binding> 
     </customBinding> 
    </bindings> 

J'ai donc essayé de se connecter à l'aide de Java suivante façon:

public static void main(String[] args) { 
    try { 
     final String wsdlResourcePath = "wsdl/jaxb/teryt/terytws1.wsdl"; 
     final String url = "https://uslugaterytws1test.stat.gov.pl/TerytWs1.svc"; 
     ITerytWs1 teryt = createSoapEndpoint((wsdlLocation) -> new TerytWs1(wsdlLocation).getCustom(), wsdlResourcePath, url); 
     System.out.println(teryt.czyZalogowany()); 
    } catch (Exception e) { } 
} 

private static <SOAP> SOAP createSoapEndpoint(SoapCreator<SOAP> soapCreator, String wsdlResourcePath, String url) { 
    ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
    URL wsdlLocation = cl.getResource(wsdlResourcePath); 
    SOAP soap = soapCreator.create(wsdlLocation); 

    BindingProvider provider = (BindingProvider) soap; 

    Map<String, Object> context = provider.getRequestContext(); 
    context.put(BindingProvider.USERNAME_PROPERTY, "TestPubliczny"); 
    context.put(BindingProvider.PASSWORD_PROPERTY, "1234abcd"); 
    context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); 
    return soap; 
} 

Malheureusement le code se fige pendant un appel "teryt.czyZalogowany()". Ne donne aucun timeout - rien, juste le traitement de cette ligne pour toujours, ou est bloqué à elle.

Mon code Java produit suivant les messages d'avertissement:

WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }SignedSupportingTokens" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }TransportBinding" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }Trust10" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://schemas.xmlsoap.org/ws/2005/07/securitypolicy }Wss11" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0075: Policy assertion "{ http://www.w3.org/2006/05/addressing/wsdl }UsingAddressing" was evaluated as "UNKNOWN". lip 27, 2017 11:58:35 AM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives WARNING: WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".

Peut-être quelqu'un sait plus sur ce genre de problème, ou sera en mesure de se connecter à ce WS tout de suite avec sa propre configuration - au moment où je don Je n'ai pas la moindre idée de ce qui pourrait être le problème, et je vois une perspective de «gaspillage de temps» en face de moi ... alors s'il vous plaît aider.

Répondre

2

s'il vous plaît activer la fonction d'adressage:

TerytWs1 teryt = new TerytWs1(); 
//teryt.setHandlerResolver(new HeaderHandlerResolver()); 
WebServiceFeature wsAddressing = new AddressingFeature(true); 
ITerytWs1 client = teryt.getCustom(wsAddressing); 
+0

Merci bartosz. Maintenant - avec l'adressage activé - la réponse Java est cohérente avec le soapui: "Une erreur s'est produite lors de la vérification de la sécurité du message.". On dirait qu'il manque encore une configuration. Êtes-vous en mesure de vous connecter et de recevoir une réponse positive de ce service Web? – msi

0

je réussi à faire se connecter à l'aide TERYT JAX-WS. D'abord, vous devez générer des classes pour le client à l'aide de wsimport. Parmi les classes générées, il y aura ITerytWs1 et TerytWs1 - elles sont les seules qui vous intéressent à ce stade. Ensuite, vous pouvez ajouter la classe SOAPHandler pour gérer les en-têtes, comme ceci:

public class TerytHeaderHandler implements SOAPHandler<SOAPMessageContext> 
{ 
    private String wsUser; 
    private String wsPassword; 

    public TerytHeaderHandler(String wsUser, String wsPassord) 
    { 
     this.wsUser = wsUser; 
     this.wsPassword = wsPassord; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext smc) 
    { 
     Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) 
     { 
      try 
      { 
       SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); 
       SOAPHeader header = envelope.getHeader(); 
       SOAPElement security = header.addChildElement("Security", "wsse", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
       SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse"); 
       SOAPElement username = usernameToken.addChildElement("Username", "wsse"); 
       username.addTextNode(wsUser); 
       SOAPElement password = usernameToken.addChildElement("Password", "wsse"); 
       password.setAttribute("Type", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
       password.addTextNode(wsPassword); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } else 
     { 
      //This handler does nothing with the response from the Web Service 
      //even though it should probably check its mustUnderstand headers 
      SOAPMessage message = smc.getMessage(); 
     } 
     return outboundProperty; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void close(MessageContext context) 
    { 
     // TODO Auto-generated method stub 
    } 

    // Gets the header blocks that can be processed by this Handler instance. 
    @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; 
    } 
} 

Ensuite, vous utilisez tout comme ceci:

public class Main { 
public static void main(String[] args) { 
    ITerytWs1 instance = new TerytWs1().getCustom(new AddressingFeature(true)); 
    Binding binding = ((BindingProvider) instance).getBinding(); 
    List<Handler> handlerList = binding.getHandlerChain(); 
    if (handlerList == null) 
     handlerList = new ArrayList<Handler>(); 
    handlerList.add(new TerytHeaderHandler("TestPubliczny", "1234abcd")); 
    binding.setHandlerChain(handlerList); 
    System.out.println(instance.czyZalogowany()); 
} 
} 

Dans mon cas, j'ai eu un problème avec les getHeaders () fonction. Géré pour traiter avec lui grâce à la suggestion sur une autre question ici sur StackOverflow.