2

Am I correctly sending an HTTPPost? I am checking my encodedAuthString against my webserver and can verify the string is correct. Not sure why I am unable to authenticate.

public JSONObject connect(String url) {
            HttpClient httpclient = new DefaultHttpClient();

            // Prepare a request object
            HttpPost httppost = new HttpPost(url);

            String authString = usernameEditText.getText().toString() + ":" + passwordEditText.getText().toString();
            String encodedAuthString = Base64.encodeToString(authString.getBytes(),Base64.DEFAULT);
            String finalAuthString = "Basic " + encodedAuthString;

            // Execute the request
            HttpResponse response;
            try {  
                httppost.addHeader("Authorization", finalAuthString);

                response = httpclient.execute(httppost);
                // Examine the response status
                Log.i("Praeda", response.getStatusLine().toString());

                // Get hold of the response entity
                HttpEntity entity = response.getEntity();

                if (entity != null) {

                    // A Simple JSON Response Read
                    InputStream instream = entity.getContent();
                    String result = convertStreamToString(instream);

                    // A Simple JSONObject Creation
                    JSONObject json = new JSONObject(result);

                    // Closing the input stream will trigger connection release
                    instream.close();

                    return json;
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected JSONObject doInBackground(String... urls) {
            return connect(urls[0]);
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized))
                    Toast.makeText(getApplicationContext(), "Authorized",Toast.LENGTH_SHORT).show();
                else if (status.equals(unauthorized))
                    Toast.makeText(getApplicationContext(), "Unauthorized",Toast.LENGTH_SHORT).show();
                else if(status.equals(notfound))
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();

            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

UPDATE:

When I hard-code the encoded string, everything is fine.

When I use the Base64 encoder I get the same results as the encoded string, but the server returns a 401.

2 Answers 2

4

You are not setting any headers in this code. Use setHeader() to set headers. This too is covered in the documentation for HttpClient, as was the information from your previous question.

Here is a sample project that sets the Authorization header. Note that it uses a separate Base64 encoder, since the built-in one only showed up with Android 2.2, IIRC.

Sign up to request clarification or add additional context in comments.

6 Comments

@Sheehan Alam: Considering that I have dozens of students and more dozens of subscribers every month trying the sample I linked to above, I feel rather confident that it works. You will need an identi.ca account to try it, including having clicked through on the email confirmation they send out.
@CommonsWare: Thanks. I have updated my code to match your example. I am using addHeader() and setEntity() but still no luck. Your code is almost identical to mine.
@CommonsWare: Updated. I hard-coded the authorization header and everything works. When I don't hard code, i get the same string, but get a 401 back from the server.
@Sheehan Alam: If you have not done so already, switch to the Base64 encoder included in my project -- I have not tried the one in Android 2.2. Also, if this is your server, log what you are getting for the authentication string on the server side.
@CommonsWare: Your Base64 encoder worked. I am not sure why Google's included encoder was not working. Thanks for your persistence and great example.
|
0

I saw extra \n in the string, so instead of using default option, I used no_wrap option like this:

Base64.encodeToString(authordata.getBytes(), Base64.NO_WRAP);

and it worked for me.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.