March 16, 2010

Android: Using NTLM authentication with HttpClient

CropperCapture[73]Sometimes the web service you want to consume is locked behind Windows (NTLM) authentication. I struggled for a bit trying to figure out how to use NTLM authentication with an HttpClient request in a sample Android application. It looked like I had everything setup properly, but it just wasn’t working. Then I found the blog post, Android: Authenticating via NTLM, that started me down the proper path. Ah-ha! NTLM authentication is not supported out of the box with HttpClient for various reasons. There is a Java library that supports NTLM authentication, the Java CIFS Client Library, but it is not bundled with Apache’s HttpClient.

According to the Apache Http Components documentation, this is due to two concerns; Microsoft only just made public the specification for NTLM in February 2008 and for whatever reason it is still not clear whether parts of the protocol are protected by patents. Secondly JCIFS is licensed under the Lesser General Public License and so is not necessarily compatible with the Apache License.

So instead of providing an actual implementation, we get a set of interfaces for clients to provide this functionality them self’s (sic): org.apache.http.auth.AuthScheme, org.apache.http.auth.AuthSchemeFactory, org.apache.http.impl.auth.NTLMScheme, org.apache.http.impl.auth.NTLMEngine, org.apache.http.impl.auth.NTLMEngineException;

So how do these classes go together? The HttpClient needs an AuthScemeFactory that will return the AuthScheme descendant NTLMScheme. NTLMScheme requires an implementation of the NTLMEngine interface to operate on.

Apache provides the interfaces but you have to provide the implementation. Now what? Well, it turns out that Apache does actually provide the code implementation but it is “out of band” and not distributed with HttpClient. You can find the details in the HttpClient documentation, NTLM Support in HttpClient. Read the linked article for details, but basically you download and import the JCIFS library from the Samba site and then copy and paste the code for two classes (from the NTLM Support in HttpClient page) to implement the NTLMEngine and AuthSchemeFactory interfaces. There are even a couple of example how to use it. Once you’ve completed those couple of steps you will have support for using NTLM authentication with your HttpClient requests from your Android application.

Comments,

  • Trackbacks,
  • and Pingbacks
blog comments powered by Disqus

 

Trackbacks and Pingbacks


  1. Pingback from Can I consume a WCF REST service using Windows Authentication without .NET libraries? | Jptab

Shortcuts

Where is Dan?


My Blog
My Blog
Twitter
Twitter
Facebook
Facebook
LinkedIn
LinkedIn
Flickr
Flickr
YouTube
YouTube
Delicious
Delicious
Foursquare
Foursquare
Pinterest
Pinterest
GetGlue
GetGlue
Pintley
Pintley
XBOX Live
XBOX Live
Last.fm
Last.fm
Windows Live
Windows Live
Telligent.com
Telligent
Graffiti CMS on CodePlex
Graffiti CMS
Popular

Recent Posts