Send authentication information with Volley request

29,584

Solution 1

For authentication, IMHO, you should override getHeaders instead of getParams, please try the following:

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
       Map<String, String> headers = new HashMap<>();                
       String credentials = "username:password";
       String auth = "Basic "
                        + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
       headers.put("Content-Type", "application/json");
       headers.put("Authorization", auth);
       return headers;
}

Hope it helps!

Solution 2

just override this method

 @Override
        public Map<String, String> getHeaders() {
            String username ="[email protected]";
            String password = "dani3173";
            String auth =new String(username + ":" + password);
            byte[] data = auth.getBytes();
            String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization",base64);
            headers.put("accept-language","EN");
            headers.put("Content-type","application/json");
            headers.put("Accept","application/json");
            return headers;
        }
Share:
29,584
Sony
Author by

Sony

Updated on July 25, 2020

Comments

  • Sony
    Sony almost 4 years

    In my Android app I have to call a web service which looks like this

    http://mywesite.com/demo/mob/getmenubycategory/1
    

    I am using the volley to send the request but the result is VolleyError 401. I have overridden the getParams() method to add the header, but it is not working.

    Here is my code.

    RequestQueue requestQueue = volleySingleton.getRequestQueue();
        requestQueue.add(new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.e(TAG, "onResponse = \n " + response.toString());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "response error \n" + error.networkResponse.statusCode);
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                try {
                    Map<String, String> map = new HashMap<String, String>();
                    String key = "Authorization";
                    String encodedString = Base64.encodeToString(String.format("%s:%s", "USERNAME", "Password").getBytes(), Base64.NO_WRAP);
                    String value = String.format("Basic %s", encodedString);
                    map.put(key, value);
                    return map;
                } catch (Exception e) {
                    Log.e(TAG, "Authentication Filure" );
                }
                return super.getParams();
            }
        });
    

    When I use my browser it shows a dialogue to enter my username and password. How can I send the username and password with the request using Volley.

  • Sdghasemi
    Sdghasemi over 7 years
    Thanks! Using getHeaders() instead of getParams() solved my problem.
  • G_V
    G_V over 7 years
    So this means creating your own Request extension? How do you pass the username:password data and where do the tokens go?
  • BNK
    BNK over 7 years
    @G_V the question is about basic authentication and as you see in my sample code String credentials = "username:password";, about the tokens, do you mean access token sent to web service? If yes, it's also in getHeaders();
  • G_V
    G_V over 7 years
    @BNK I am completely new to doing anything security but this means storing the username and password, putting them in the header, sending them, getting a token and then clearing user/pass out in favor of storing the token then?
  • BNK
    BNK over 7 years
    @G_V yes, however, it depends on the web service that your android app sending requests, for example, if your web service is ASP.NET Web API, you can see some flows at asp.net/web-api/overview/security/…
  • BNK
    BNK over 7 years