Magazine Internet

[DEV] WS-Security - Username token - Client CXF

Publié le 31 juillet 2008 par Spawnrider @spawnrider

WS-Security permet de sécuriser facilement des web services. Il permet entre autre :

  • Une authentification par user/password (token) entre les services,
  • Un encryptage d’une partie ou de la totalité d’un message,
  • De signer des messages,
  • D’horodater des messages.

Apache CXF est un framework permettant d’implémenter les standards JAX-WS pour créer des web services en Java en se reposant sur WSS4J. Il s’intègre également avec Spring, Aegis, RESTful, et WS-*. Il est aujourd’hui dans sa version 2.1.1.

securityalert

Vous trouverez sur le wiki cxf un complément d’information et un exemple d’implémentation de WS-Security via CXF. Il existe également un exemple utilisant XWSSS avec Spring.

Une des sécurité la plus basique est celle fournie par l’authentification via Username Token.

Je vais donc vous présenter un moyen simple d’ajouter l’authentification via Username Token dans les en-têtes Soap Header de votre client web service en utilisant CXF.

1 – Le XML en entrée d’un web service contient l’en-tête sécurisé :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <SOAP-ENV:Envelope
  3.     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  4. <SOAP-ENV:Header>
  5. <wsse:Security xmlns:wsse="…"
  6. SOAP-ENV:mustUnderstand="1">
  7. <wsse:UsernameToken xmlns:wsu="…"
  8. wsu:Id="XWSSGID-1172860158358-935964365">
  9. <wsse:Username>user</wsse:Username>
  10. <wsse:Password Type="…#PasswordText">password</wsse:Password>
  11. </wsse:UsernameToken>
  12. </wsse:Security>
  13. </SOAP-ENV:Header>
  14. <SOAP-ENV:Body>
  15. <echoRequest
  16. xmlns="…">Hello</echoRequest>
  17. </SOAP-ENV:Body>
  18. </SOAP-ENV:Envelope>

2 – Vous pouvez ajouter facilement cette en-tête sécurisée en Java directement dans le code du client Web Service (pouvant être généré via la commande wsdl2java de CXF/Axis).

Voici un exemple de code client :

  1. WebService_Service service = new WebService_Service();
  2. WebService port = service.getPort(WebService.class);

A la suite, il suffit d’ajouter un proxy client qui va prendre en charge les en-têtes (SOAP Header) sécurisées :

  1. Client client = ClientProxy.getClient(port);
  2. Endpoint cxfEndpoint = client.getEndpoint();

Puis instancier une HashMap qui contiendra les propriétés de sécurité :

  1. Map outProps = new HashMap();

On ajoute ensuite l’intercepteur qui prendra en charge les propriétés définies :

  1. WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
  2. cxfEndpoint.getOutInterceptors().add(wssOut);
  3. cxfEndpoint.getOutInterceptors().add(new SAAJOutInterceptor());

Et pour finir on ajoute les propriétés de sécurité (user/password) dans la HashMap :

  1. outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
  2. // Specify our username
  3. outProps.put(WSHandlerConstants.USER, “ws-client”);
  4. // Password type : plain text
  5. //outProps.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
  6. // for hashed password use:
  7. //properties.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
  8. outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
  9. // Callback used to retrive password for given user.
  10. outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordHandler.class.getName());

Comme vous pouvez le constater, le mot de passe n’est pas défini ici. La dernière ligne (PW_CALLBACK_CLASS) intervient alors. C’est une fonction de callback qui va se charger de l’ajout du mot de passe dans l’en-tête.

Voici donc cette fonction de callback :

  1. public class ClientPasswordHandler implements CallbackHandler {
  2.   public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
  3.     WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
  4.     // set the password for the outbound message.
  5.     pc.setPassword(”password”);
  6.   }
  7. }

Avec ce code, vos en-têtes seront générées automatiquement depuis vos clients (Java) web service.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Spawnrider 1431 partages Voir son profil
Voir son blog

Magazine