Ошибка авторизации токена Android Volley .NET Rest - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь использовать веб-API, встроенный в .NET Framework, в котором используется система аутентификации токена. Эти API используются в Android с использованием Volley.

Так что эти API отлично работают при тестировании в почтальоне, поэтому я собираюсь поделиться скриншотом конфигурации почтальона, следуя коду, который я использую в Android.

Token auth postman

public static void authorizeAPIClient(final String username, final String password, RequestQueue requestQueue){

    StringRequest stringRequest = new StringRequest(Request.Method.POST,
            apiPath + "api/authorise/token",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    MainActivity.getToken(response);
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {


        }
    }) {

        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }



        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("grant_type", "password");
            params.put("username", username);
            params.put("password", password);
            return params;
        }

    };

    requestQueue.add(stringRequest);
}

Так что эта часть работает отлично, и я могу извлечь токен из JSON и даже протестировать токен, полученный на устройстве Android, используя почтальон, и он отлично работает. Что я нахожу странным в этом, так это то, что я использую getParams(), чтобы передать ему имя пользователя и пароль, в то время как в почтальоне мне нужно сделать это через форму.

Теперь, когда мы получили токен с сервера и установили, что он работает, я пытаюсь вызвать другую функцию, для которой требуется токен.

Get User Details

public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){

    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            apiPath + "API/points/getUserDetails",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    Log.i("API", response);
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("API", error.toString());

        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("UserId", userId);
            return params;
        }
        @Override
        public Map<String, String> getHeaders(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "Bearer " + token);
            return params;
        }
    };

    requestQueue.add(stringRequest);

При вызове этой функции я получаю одну из следующих ошибок в зависимости от того, как я передаю параметры и заголовки:

  1. com.android.volley.ServerError

  2. com.android.volley.AuthFailureError

Я не уверен, какая ошибка возникнет первой, т. Е. Может ли она вызвать ошибку сервера до или после AuthFailureError, поэтому трудно определить, авторизуется ли он когда-либо или правильно переданы параметры URL.

Кто-нибудь знает, что я делаю неправильно, я искал StackOverFlow и у меня ничего не получалось.

Также, извините за всю черную подкладку, секретная информация: D

1 Ответ

0 голосов
/ 24 августа 2018

Попробуйте это

public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){

StringRequest stringRequest = new StringRequest(Request.Method.GET,
        apiPath + "API/points/getUserDetails?UserId=" + userId,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                Log.i("API", response);
            }
        }, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        Log.i("API", error.toString());

    }
}) {
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError{
        Map<String, String> params = new HashMap<String, String>();
        params.put("Authorization", "Bearer " + token);
        return params;
    }
};

requestQueue.add(stringRequest);
...