java - CXF SOAP Client con NTLM a SharePoint
(3)
Por favor, intente de esta manera!
HTTPConduit http = (HTTPConduit)client.getConduit();
AsyncHTTPConduit conduit = (AsyncHTTPConduit)http;
DefaultHttpAsyncClient defaultHttpAsyncClient;
defaultHttpAsyncClient = conduit.getHttpAsyncClient();
defaultHttpAsyncClient.getCredentialsProvider().setCredentials( AuthScope.ANY,
new NTCredentials( USER,PWD, "", DOM ) );
conduit.getClient().setAllowChunking( false );
conduit.getClient().setAutoRedirect( true );
Estoy escribiendo un cliente SOAP usando CXF Framework (versión: 2.7.8) para SharePoint 2007. He seguido la documentación en línea para agregar soporte NTLM aquí . Tengo el cliente trabajando y el rastreo de la sesión HTTP muestra que se están enviando credenciales NTLM, sin embargo, sigo recibiendo una respuesta 401 no autorizada.
Código:
Lists listService = new Lists();
ListsSoap port = listService.getListsSoap();
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put("use.async.http.conduit", Boolean.TRUE);
Credentials creds = new NTCredentials(USER, PASS, "", DOMAIN);
bp.getRequestContext().put(Credentials.class.getName(), creds);
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
http.setClient(httpClientPolicy);
// Build request and execute
Curiosamente, escribí un cliente similar utilizando HTTP PUT para WebDAV para cargar documentos usando la biblioteca HTTPClient de Apache, y pude autenticarme exitosamente usando NTLM. Además, pude usar SOAPUI para invocar el mismo servicio web de Listas para el que estoy tratando de construir el cliente Java y también se autenticó exitosamente usando NTLM.
Supongo que la implementación de NTLM es diferente entre CXF y HTTPClient. ¿Alguna idea de lo que está mal con mi implementación de CXF? ¿O cómo puedo lograr que refleje la implementación de HTTPClient?
@lamarvannoy, también recibí este error. Pero encontré otra manera. No es necesario convertir HTTPConduit en AsyncHTTPConduit. Probemos esto:
public class Test {
static final String kuser = "yourDomain//username";
static final String kpass = "yourPassword";
static class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
System.err.println("Feeding username and password for " + getRequestingScheme());
return (new PasswordAuthentication(kuser, kpass.toCharArray()));
}
}
public static void main(String[] args) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
Lists listService = new Lists();
ListsSoap port = listService.getListsSoap();
Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);
String listName = "S030_main";
String rowLimit = "150";
ArrayList<String> listColumnNames = new ArrayList<String>();
listColumnNames.add("Title");
Test.displaySharePointList(port, listName, listColumnNames, rowLimit);
}
}
Puede encontrar la implementación del método displaySharePointList () en esta publicación: http://davidsit.wordpress.com/2010/02/10/reading-a-sharepoint-list-with-java-tutorial/
Espero que esto te proteja a ti y a los demás.
Esto funciona para mí:
Client client = ClientProxy.getClient(port);
AsyncHTTPConduit conduit = (AsyncHTTPConduit)client.getConduit();
AuthorizationPolicy authorization = conduit.getAuthorization();
authorization.setUserName("domain//username");
authorization.setPassword("password");
En realidad, esto funciona tanto para NTLM como para Basic