In one of my Android apps, a user should be able to push JSON data to the server. Of course this should only be allowed if the user is authorized by his credentials. For simplicity, I decided to use Basic Auth via HTTPS.
As I usually do not deal with Connectsions directly, I prefer to use the Apache Http classes to make life easier. So I used code like the following:
HttpParams httpParams = new BasicHttpParams(); HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8); HttpProtocolParams.setHttpElementCharset(httpParams, HTTP.UTF_8); HttpConnectionParams.setConnectionTimeout(httpParams, 5000); client = new DefaultHttpClient(httpParams); client.getCredentialsProvider().setCredentials( new AuthScope("localhost",80), new UsernamePasswordCredentials(username, password) );
This was fine and worked in my local test environment and also in the live stage with GET requests. But when I started to POST data to the server I always got a “401 Unauthorized”. First I thought It’d be malformated JSON or encoding issues – but even with an empty string as payload I simply didn’t get through. Also the “same” POST request from the commandline using CURL worked like a charm! So it was very likely to be an issue with my handling of the Apache HTTP Lib. Stackoverflow also showed various people with the same problem. The proposed solution that came up several times was to manually set up the auth header. Not really the solution that I thought would be the greatest one.
After some more StackOverflow Posts and API crawling I found the very simple solution:
client.getCredentialsProvider().setCredentials( new AuthScope(AuthScope.ANY), new UsernamePasswordCredentials(username, password)
And yes, it was that easy! Just set the Auth scope correctly.
I’m just very surprised that I only encountered issues with the POST request. The very same configuration worked with a GET without problems. This was actually the point that made me sure that this part of the code was correct.