¿Consumiendo Web Services protegidos con MSFT NTLM?

En un proyecto en el que estoy participando, existe la necesidad de interactuar con Web Services publicados sobre Microsoft Sharepoint, pero que usan NTLM como Security Provider para la Autenticación.
NTLM no es precisamente algo nuevo en el mercado, inclusive es bastante viejo. Pero la realidad es que hay aún muchos productos de MSFT que lo ocupan.
En ocasiones, con todo esto de la facilidad de SOA, es muy complicado pedirle al cliente que cambie la forma en la que opera algunos de sus Servicios, por lo que es necesario ingeniárselas para resolver este tipo de situaciones.

Para el caso específico de NTLM lo que hice fué crear un Stub utlizando Axis 1.5.1 (lo puedes descargar de aquí). Axis2 tiene una utilería para transformar de WSDL a Java. De hecho tiene varias opciones para el stub, yo estoy ocupando Axis Data Binding, pero en realidad hay otras, como:

  • AXIOM Client : Son clases genéricas que no hacen un bind entre SOAP y las clases. Usa directamente AXIOM para la interoperabilidad con el Servicio. Es regularmente utilizado para transmisiones puras de XML.
  • JiBX: Muy orientado al soporte completo de XML Schemas. Es muy poderoso pero puede llegar a ser complejo.
  • XMLBeans: Es muy flexible para el manejo de los XML Schemas. Practicamente para cualqueir tipo de WS esta opción te servirá, sólo que sigue siendo mas compleja que el Axis Data Binding.
Los pasos que debes seguir son los siguientes:
  1. Descargar Axis2 a tu máquina
  2. Ubicar el WSDL protegido con NTLM
  3. Descárgalo a Disco, por ejemplo: pruebaSharepoint.asmx
  4. Ve a la carpeta BIN de tu instalación de Axis2
  5. Ejecuta el siguiente comando:
WSDL2Java –uri pruebaSharepoint.asmx -p mx.sps.testSP -d adb -s
Donde mx.sps.testSP es el nombre del paquete donde se generará tu clase. Esto te va a generar una clase llamada pruebaSharepointStub.java, que tendrá toda la lógica para consumir al WS.
Se recomienda que hagas una clase adicional que sea la que utilice los métodos de la recién generada, de manera que antes de mandarla a llamar establezcas que la comunicación va a utilizar NTLM, así:

HttpTransportProperties.Authenticator auth =
new HttpTransportProperties.Authenticator();
auth.setUsername(“usuario”);
auth.setPassword(“password”);
auth.setDomain(“dominio”);
auth.setHost(“host”);
List preferenciasAutenticacion= new ArrayList(1);
preferenciasAutenticacion.add(AuthPolicy.NTLM);
auth.setAuthSchemes(authPrefs);
// Aquí hay que poner el endpoint del WS que queremos usar
pruebaSharepointStub mps =
new pruebaSharepointStub("http://localhost:14300/_prueba/pruebaSharepoint.asmx");
// Estableces el autenticador
mps._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE,
auth);
//Empiezas a utilizar los métodos
UpdateDatos envio = new UpdateDatos();
//Aquí pon los sets de acuerdo al Método que quieras usar, en este caso estamos usando UpdateDatos
envio.setCampo1("");
envio.setCampo2("");
envio.setCampo3("");

UpdateDatosResponse respuesta = mps.updateDatos(envio);
Con esto podrás consumir el WS, después pudieras esto incorporarlo a un Java Callout desde Oracle Service Bus.
Le doy gracias a Derek Miller. De su blog saqué mucha de la información de esta entrada: http://derekjmiller.spaces.live.com/blog/cns!A77124B9D0EE317F!142.entry