WEBSERVICES Michael Fortier Master Informatique 2ème année fortier@lipn.univ-paris13.fr A308, Université de Paris 13 https ://lipn.univ-paris13.fr/ fortier/enseignement/webservices/
Sommaire 1 Rappels 2 METRO 3 Apache CXF Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 2 / 43
Sommaire 1 Rappels 2 METRO 3 Apache CXF Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 3 / 43
RAPPELS Service web : logiciel qui interagit avec d autres au moyen de protocoles universels (http, xml...) Deux formes : SOAP : Simple Object Access Protocol Orienté objet, gère les états Protocole basé sur XML et qui définit les mécanismes d échanges d information entre les clients et les fournisseurs de service-web Les messages SOAP sont susceptibles d être transportés en HTTP, SMTP, FTP... XML-RPC : Remote Procedure Call Procédural et sans gestion des états Permet l invocation de procédure distante sur internet Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 4 / 43
Caractéristiques des WS Enregistrement facultatif auprès d un service de recherche (UDDI) Annuaire Interface publique avec laquelle le client invoque le service (WSDL) Description Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 5 / 43
SOAP : deux modes de communication SOAP RPC : appel synchrone de procédures distantes Un nœud SOAP envoie une requête SOAP avec des paramètres et reçoit une réponse en retour messages SOAP : communication orientée message des nœuds SOAP envoient et reçoivent des documents XML de manière synchrone ou non Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 6 / 43
Structure d un message SOAP Une enveloppe qui définit le contenu du message Un en-tête (optionnel) qui contient les informations d en-tête (autorisations et transactions par exemple) Un corps contenant les informations sur l appel et la réponse Une gestion d erreur qui identifie la condition d erreur des attachements (optionnel) Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 7 / 43
Éléments SOAP actor : indique le point d arrivée d un élément d en-tête. Un message SOAP peut passer par un ensemble d intermédiaires avant d arriver à sa destination finale Possibilité de cibler un attribut vers un de ces points intermédiaires via cet attribut encodingstyle : sert à définir les types de données contenu dans le document mustunderstand : sert à définir si le destinataire d un message doit traiter un élément d en-tête (absence de cet attribut = false) Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 8 / 43
WSDL Format de description des services web fondé sur XML Communication par échange de messages Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 9 / 43
WSDL définit les Types : un système de types applicable à des données (Utilisation de XML Schema) le Message : données échangées entre services web ( appel de procédure) le Type de Port (porttype) : opérations du service web et les messages impliqués ( interface Java) La Liaison (binding) : format des messages ( Implémentation de l interface) Le Port : point de terminaison identifié de manière unique par la combinaison d une adresse internet et d une liaison Un Service Web (service) : associe des liaisons à des process concrets de mise en œuvre des opérations qu elles décrivent Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 10 / 43
Sommaire 1 Rappels 2 METRO 3 Apache CXF Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 11 / 43
JAX-WS RI + WSIT JAX-WS Implémentation API Java pour WS XML Cœur des WS Architecture extensible et modulaire Web Services Interoperability Technology Assure QoS (Sécurité, transactions...) Implémentation des spécifications WS-* (interopérabilité.net) Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 12 / 43
METRO Communauté IBM Jdk, Glassfish, Oracle... OpenSSO, OpenESB, Wiseman Forums, mailing Lists actifs populaire http ://metro.java.net Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 13 / 43
METRO : Architecture Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 14 / 43
Fonctionnalités Intégration à Netbeans simplicité Utilisations de Pojo via annotations Indépendance de l encodage, du protocole et transport Intégration JAXB (Java Architecture for XML Binding) Plateforme 100% Java 100% XML Schema Support Communications optimisées Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 15 / 43
Fonctionnement Le client manipule une interface métier. Il ne sait pas que le composant est un WS Le service est sollicaité via son interface métier Client JAX-WS Messages SOAP Service JAX-WS JAX-WS s'occupe de la transformation du modèle objet / message SOAP Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 16 / 43
Etude de cas simple Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 17 / 43
Processus de développement : Partie serveur Netbeans Générer la classe WS, transparent TP/WS_METRO/src/java/m2pls/calcul_ws.java @WebService() public class calcul_ws { @WebMethod(operationName = "add") public int add(@webparam(name = "i") int i, @WebParam(name = "j") int j) { int k = i + j; return k; } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 18 / 43
Processus de développement : Partie client } Netbeans Générer les interfaces du WS TP/WS_METRO_Client/test/WSTest.java @Test public void test() { try { // Creation du WS client m2pls.calculwsservice service = new m2pls.calculwsservice(); m2pls.calculws port = service.getcalculwsport(); // Initialisation int i = 4; int j = 5; // Appel du WS int result = port.add(i, j); // Affichage du resultat System.out.println("Result = " + result); } catch (Exception ex) { ex.printstacktrace(); } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 19 / 43
Sécuriser un WS avec Metro Différents types de sécurisation : Username Authentication with Symmetric Keys Mutual Certificates Security. Transport Security (SSL). Message Authentication over SSL. SAML Authorization over SSL Endorsing Certificate SAML Sender Vouches with Certificates SAML Holder of Key Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 20 / 43
Sécuriser un WS avec Metro Fort couplage Netbeans Glassfish Metro Génération automatique Tests en TP Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 21 / 43
Sommaire 1 Rappels 2 METRO 3 Apache CXF Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 22 / 43
Framework Framework de développement de WS Projet Apache 2.7.x Intégration facile dans des projets existants (à partir des interfaces) Intégration à Spring http ://cxf.apache.org/ Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 23 / 43
Fonctionnalités Support des standards WS-* : WS-Basic Profile, WS-Addressing, WS-Policy, WS-Security Support de JAX-WS (inclus JAXB et SAAJ) Support de SOAP, WSDL, MTOM Développement basé sur POJO annotés (facilité) Nombreux outils intégrés Nombreux formats transport : Http(s), JMS, CXF Format données : XML, JSON Plusieurs stratégies binding XML : JAXB, Aegis Plusieurs stratégies de binding non-xml : json, corba, jbi, sca Déploiement flexible : serveurs J2EE, intégration sca (Tuscany) et jbi (service engine pour ServiceMix, OpenESB, Petals) Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 24 / 43
Fonctionnement Incoming : RECEIVE (PRE/USER/POST)_STREAM READ Outcoming : (PRE/USER/POST)_PROTOCOL UNMARSHAL (PRE/USER/POST)_LOGICAL PRE_INVOKE INVOKE POST_INVOKE SETUP (PRE/USER/POST)_LOGICAL PREPARE_SEND PRE_STREAM PRE_PROTOCOL WRITE MARSHAL (USER/POST)_PROTOCOL (USER/POST)_STREAM Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 25 / 43
Interceptor Client Endpoint Service Bus (backbone de l architecture) Binding Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 26 / 43
Etude de cas simple Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 27 / 43
Processus de développement : Partie serveur Fournir une interface + une classe d implémentation qui seront annotées avec les annotations de l API JAX-WS package service; import javax.jws.webservice; @WebService public interface ICalculService { public int add(int i, int j); } TP/WS_CXF/src/java/service/ICalculService.java package service; TP/WS_CXF/src/java/service/CalculService.java public class CalculService implements ICalculService{ public int add(int i, int j){ return i+j; } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 28 / 43
Processus de développement : Partie serveur Configurer Spring pour déclarer le bean de service web TP/WS_CXF/src/java/applicationContext.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:meta-inf/cxf/cxf.xml" /> <import resource="classpath:meta-inf/cxf/cxf-extension-soap.xml" /> <import resource="classpath:meta-inf/cxf/cxf-servlet.xml" /> <bean id="calculservice" class="service.calculservice" /> <jaxws:endpoint id="calculserviceendpoint" implementor="#calculservice" address="/icalculservice" /> </beans> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 29 / 43
Processus de développement : Partie serveur Configurer la Servlet CXF dans le fichier web.xml TP/WS_CXF/web/WEB-INF/web.xml <?xml version="1.0" encoding="utf-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> <context-param> <param-name>contextconfiglocation</param-name> <param-value> classpath:applicationcontext.xml </param-value> </context-param> <servlet> <servlet-name>calculservlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.cxfservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>calculservlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> < Michael! */ Fortier > (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 30 / 43
Processus de développement : Partie client Génération des classes clientes à partir du WSDL Outils Netbeans (Metro) Outils CXF : wsdl2java Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 31 / 43
Processus de développement : Partie client Exécution classique, sans Spring TP/WS_CXF_Client/test/WSTest.java @Test public void testcxf(){ try { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getininterceptors().add(new LoggingInInterceptor()); factory.getoutinterceptors().add(new LoggingOutInterceptor()); factory.setserviceclass(icalculservice.class); factory.setaddress("http://localhost:8080/ws_cxf/icalculservice?wsdl"); ICalculService client = (ICalculService) factory.create(); int i = 4; int j = 5; int result = client.add(i, j); System.out.println("Result 2 = " + result); } catch (Exception ex) { ex.printstacktrace(); } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 32 / 43
Processus de développement : Partie client Utilisation de Spring TP/WS_CXF_Client/src/applicationContext.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <bean id="clientfactory" class="org.apache.cxf.jaxws.jaxwsproxyfactorybean"> <property name="serviceclass" value="service.icalculservice"/> <property name="address" value="http://localhost:8080/ws_cxf/icalculservice?wsdl"/> </bean> <bean id="calcul" class="service.icalculservice" factory-bean="clientfactory" factory-method="create"/> <jaxws:client id="calcul2" serviceclass="service.icalculservice" address="http://localhost:8080/ws_cxf/icalculservice?wsdl" /> </beans> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 33 / 43
Processus de développement : Partie client Exécution avec Spring : 1ère méthode TP/WS_CXF_Client/test/WSTest.java @Test public void testspring() { String[] paths = {"applicationcontext.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(paths); ICalculService client = (ICalculService) ctx.getbean("calcul"); int i = 4; int j = 5; int result = client.add(i, j); System.out.println("Result = " + result); } Exécution avec Spring : 2ème méthode TP/WS_CXF_Client/test/WSTest.java @Test public void testspring2() { String[] paths = {"applicationcontext.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(paths); ICalculService client = (ICalculService) ctx.getbean("calcul2"); int i = 4; int j = 5; int result = client.add(i, j); System.out.println("Result = " + result); } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 34 / 43
Securiser un WS avec CXF Utilisation de WS-security : http ://cxf.apache.org/docs/ws-security.html Utilisation d une méthode d authentification Token Identifiant/Mot de passe Cryptage du transport -> HTTPs, token sécurisés Utiliser le support du serveur d applications (port 8181 pour Glassfish) Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 35 / 43
Securiser un WS : Configuration dans Spring TP/WS_CXF_Secure/src/java/applicationContext.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:cxf="http://cxf.apache.org/core" xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:meta-inf/cxf/cxf.xml" /> <import resource="classpath:meta-inf/cxf/cxf-extension-soap.xml" /> <import resource="classpath:meta-inf/cxf/cxf-servlet.xml" /> <!-- Interceptors --> <bean id="login" class="org.apache.cxf.interceptor.loggingininterceptor" /> <bean id="logout" class="org.apache.cxf.interceptor.loggingoutinterceptor" /> <bean id="saajin" class="org.apache.cxf.binding.soap.saaj.saajininterceptor" /> <bean id="wss4jin" class="org.apache.cxf.ws.security.wss4j.wss4jininterceptor"> <constructor-arg> <map> <entry key="action" value="usernametoken Timestamp" /> <entry key="passwordtype" value="passwordtext" /> </map> </constructor-arg> </bean> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 36 / 43
Securiser un WS : Configuration dans Spring TP/WS_CXF_Secure/src/java/applicationContext.xml <cxf:bus> <cxf:features> <cxf:logging /> </cxf:features> <cxf:properties> <entry key="ws-security.validate.token" value="false" /> <entry key="ws-security.ut.no-callbacks" value="true" /> <entry key="ws-security.ut.validator" value="test.utvalidator" /> </cxf:properties> <cxf:ininterceptors> <ref bean="login" /> </cxf:ininterceptors> <cxf:outinterceptors> <ref bean="logout" /> </cxf:outinterceptors> <cxf:infaultinterceptors> <ref bean="login" /> </cxf:infaultinterceptors> <cxf:outfaultinterceptors> <ref bean="logout" /> </cxf:outfaultinterceptors> </cxf:bus> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 37 / 43
Securiser un WS : Configuration dans Spring TP/WS_CXF_Secure/src/java/applicationContext.xml <!-- End points --> <jaxws:endpoint id="calculserviceendpoint" implementor="#calculservice" address="/icalculservice" > <jaxws:ininterceptors> <ref bean="saajin" /> <ref bean="wss4jin" /> </jaxws:ininterceptors> </jaxws:endpoint> <!-- Bean d acces --> <bean id="calculservice" class="service.calculservice" /> </beans> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 38 / 43
Securiser un WS : Implémentation du validateur TP/WS_CXF_Secure/src/java/test/UTValidator.java public class UTValidator extends UsernameTokenValidator { @Override protected void verifyplaintextpassword(usernametoken usernametoken, RequestData data) throws WSSecurityException { if (!usernametoken.getname().equalsignorecase("michael")!usernametoken.getpassword().equalsignorecase("mdp")) { throw new WSSecurityException(WSSecurityException.FAILED_AUTHENTICATION); } } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 39 / 43
Sécuriser le client du WS Modifier la configuration de Spring intercepteurs TP/WS_CXF_Client_Secure/src/applicationContext.xml <!-- Interceptors --> <bean id="login" class="org.apache.cxf.interceptor.loggingininterceptor" /> <bean id="logout" class="org.apache.cxf.interceptor.loggingoutinterceptor" /> <bean id="saajout" class="org.apache.cxf.binding.soap.saaj.saajoutinterceptor" /> <bean id="wss4jout" class="org.apache.cxf.ws.security.wss4j.wss4joutinterceptor"> <constructor-arg> <map> <entry key="action" value="usernametoken Timestamp" /> <entry key="user" value="ws-client" /> <entry key="passwordtype" value="passwordtext" /> <entry key="passwordcallbackclass" value="test.pwcallbackhandler" /> </map> </constructor-arg> </bean> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 40 / 43
Sécuriser le client du WS Modifier la configuration de Spring bus <!-- The CXF Bus --> <cxf:bus> <cxf:features> <cxf:logging /> </cxf:features> <cxf:ininterceptors> <ref bean="login" /> </cxf:ininterceptors> <cxf:outinterceptors> <ref bean="logout" /> </cxf:outinterceptors> <cxf:infaultinterceptors> <ref bean="login" /> </cxf:infaultinterceptors> <cxf:outfaultinterceptors> <ref bean="logout" /> </cxf:outfaultinterceptors> </cxf:bus> TP/WS_CXF_Client_Secure/src/applicationContext.xml Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 41 / 43
Sécuriser le client du WS Modifier la configuration de Spring TP/WS_CXF_Client_Secure/src/applicationContext.xml <!-- Client Proxies --> <jaxws:client id="calcul" serviceclass="service.icalculservice" address="http://localhost:8080/ws_cxf_secure/icalculservice?wsdl"> <jaxws:outinterceptors> <ref bean="saajout" /> <ref bean="wss4jout" /> </jaxws:outinterceptors> </jaxws:client> </beans> Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 42 / 43
Sécuriser le client du WS Créer le callbackhandler login/mdp TP/WS_CXF_Client_Secure/src/test/PWCallbackHandler.java public class PWCallbackHandler implements CallbackHandler { @Override public void handle(callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; pc.setidentifier("michael"); pc.setpassword("mdp"); } } Michael Fortier (Université Paris 13) WEBSERVICES M2I,LEE,2014-2015 43 / 43