L'authentification basic transmettant le login et le mot de passe en clair, il est indispensable de l'utiliser via une connexion chiffré (HTTPS).
JAX-RS est l'un des standard pour faire des web-services JAVA :
- JAX-RS = JSR311 pour les webservices REST
- JAX-WS = JSR 224 pour les webservices SOAP
En dehors des standards il existe un certain nombre de frameworks pour faire des web-services REST en JAVA :
- http://www.restlet.org/
- http://www.jboss.org/resteasy/docs.html
- http://jersey.java.net/
- https://github.com/jacek99/Napalm
A l'époque j'était parti sur une base CXF, mais la documentation n'étais pas très abondante.
Ensuite j'ai migré sur Restlet. La solution n'a pas été très évidente à trouver, mais ça marche.
Voici la solution (pour les plus pressés):
https://github.com/Filirom1/JAX-RS-Server/blob/master/src/main/java/org/filirom1/jaxrs/JAXRSServer.java
Maintenant, si vous ne voulez pas vous prendre la tête, voici une API plus simple d'utilisation :
JAXRSServer server = new JAXRSServer(MyResource.class, 8443); server.enableBasicAuthentication("Realm", "login", "password"); server.enableSSL("www.hostname.fr", new File("path-to-your-keystore.jks"), "keyStorePassword", "keyPassword"); try { server.start(); /* do what you have to do */ server.stop(); } catch (Exception ex) { Assert.fail("Unable to start", ex); }
Et voici un exemple de Resource JAX-RS qui affiche un hello world :
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @Path("/") class MyRessource{ @GET @Produces("text/plain") public String getPlain() { return "Hello world)";
Et pour les utilisateurs de maven, voila comment inclure cet API dans votre pom.xml :
<dependencies>... <dependency> <groupId>org.filirom1</groupId> <artifactId>JAX-RS-Server</artifactId> <version>1.0.0</version> <type>jar</type> </dependency>...</dependencies><repositories> <repository> <id>filirom1-repo</id> <url>https://Filirom1@github.com/Filirom1/filirom1-mvn-repo/raw/master/releases</url> </repository> <repository> <id>maven-restlet</id> <url>http://maven.restlet.org</url> </repository></repositories>
https://github.com/Filirom1/JAX-RS-ServerJuste pour le fun, j'utilise Resty comme client Webservice REST.
Il est simple d'utilisation et léger (0 dépendance externe).
Voici un exemple pour faire un GET avec authentification basic :
Resty r = new Resty();r.authenticate("https://localhost:8443", "login", "password".toCharArray());String resp = r.text("https://localhost:8443").toString();
Si vous avez des problèmes avec votre client REST avec les certificats auto-signés, je vous conseil le code de Francis Labrie :
- SSLUtilities.trustAllHostnames() pour désactiver la vérification du hostname pour les connexion HTTPS
- SSLUtilities.trustAllHttpsCertificates() pour désactiver la vérification du certificat pour les connexions HTTPS
Et si vous ne savez encore comment générer un certificat auto-signé :
# Generate a Self-Signed Certificate #
keytool -genkey -v -alias localhost -dname "CN=localhost, OU=IT, O=MyCompany, L=Lyon, ST=France, C=FR" -keypass password -keystore localhost.jks -storepass password -keysize 1024;
# Export your certificate in order to import it in your trustore
keytool -storepass password -alias localhost -export -file localhost.cer -keystore localhost.jks
# Import your certificate into the default JAVA truststore.
sudo keytool -keystore /etc/java-6-sun/security/cacerts -storepass changeit -import -trustcacerts -v -alias localhost -file localhost.cer
Ou sinon, on peut également générer des certificats auto-signés avec maven (très pratique pour les tests) :
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>keytool-maven-plugin</artifactId> <executions> <execution> <phase>generate-resources</phase> <id>clean</id> <goals> <goal>clean</goal> </goals> </execution> <execution> <phase>generate-resources</phase> <id>genkey</id> <goals> <goal>genkey</goal> </goals> </execution> </executions> <configuration> <keystore>${project.build.directory}/localhost.jks</keystore> <dname>CN=localhost, OU=IT, O=MyCompany, L=Lyon, ST=France, C=FR</dname> <keypass>password</keypass> <storepass>password</storepass> <alias>localhost</alias> <keyalg>RSA</keyalg> </configuration> </plugin>
Aucun commentaire:
Enregistrer un commentaire