Аутентификация не удалась с использованием залпа

я пытаюсь получить токен с сервера (Laravel) и сохранить в базу данных (android), но при отправке запроса на сервер я получаю эту ошибку:

E/Volley: [276] BasicNetwork.performRequest: Unexpected response code 401 for http://192.168.1.4:8000/api/user/login
E/Volley: [276] BasicNetwork.performRequest: Unexpected response code 401 for http://192.168.1.4:8000/api/user/login
D/error: com.android.volley.AuthFailureError

код андроида (java):

  public void loginUser(String email, String password, final OnLoginResponse onLoginResponse){
            JSONObject requestJsonObject=new JSONObject();
            try {
                requestJsonObject.put("email",email);
                requestJsonObject.put("password",password);
            JsonObjectRequest request=new JsonObjectRequest(Request.Method.POST, "http://192.168.1.4:8000/api/user/login",requestJsonObject , new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    onLoginResponse.onResponse(response.optString("token"));

                    Log.d("response",response.toString());
                }

            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("error",error.toString());
                }
            }) {
                /**
                 * Passing some request headers*
                 */
                @Override
                public Map getHeaders() throws AuthFailureError {
                    HashMap headers = new HashMap();
                    headers.put("Content-Type", "application/json");
                    headers.put("csrf-token", "X-XSRF-TOKEN");

                    return headers;
                }
            };
            request.setRetryPolicy(new DefaultRetryPolicy(18000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            Volley.newRequestQueue(context).add(request);
        } catch (JSONException e) {
            Log.e(TAG, "loginUser: "+e.toString());
        }
    }

Я проверил клиента с помощью почтальона, это не проблема, и без проблем возвращаю токен.

это скриншот почтальона:

введите описание изображения здесь

Можете ли вы показать, как вы делаете запрос в почтальоне?

denis_lor 09.03.2019 21:59

да, я отправил json в таком формате {username:"example", ...} и токен возврата почтальона в формате Json.

Ramin 09.03.2019 22:01

Можете ли вы опубликовать точный запрос, который вы отправили в Postman, либо в виде JSON, либо в виде скриншотов, чтобы проверить, как вы отправляете заголовок запроса.

denis_lor 09.03.2019 22:05

конечно, добавил скрин.

Ramin 09.03.2019 22:15

На скриншоте вы загрузили что-то с name, которого нет в вашем java-коде, оно имеет другую конечную точку localhost и /register, вместо этого в java у вас есть 192.168.1.4... и /login. Можете ли вы также показать в своем правильном запросе с почтальоном (я сказал здесь, чтобы посочувствовать, что скриншот не выглядит так же, как код, который вы пытаетесь использовать с Java и Volley), где вы используете заголовки, такие как csrf-token?

denis_lor 09.03.2019 22:24

Мне очень жаль, я неправильно загрузил скриншот. я изменил на скриншот входа в систему, пожалуйста, проверьте еще раз. о конечной точке localhost: в Android программа должна получить доступ к локальному хосту, используя ip и с ошибкой возврата localhost:8000.

Ramin 09.03.2019 22:31

Хорошо! Вы пробовали сначала почтальон, а затем вызов API через залп Android или наоборот, чтобы увидеть, соответствует ли это порядку запросов? Может быть, вы не поддерживаете множественную аутентификацию входа в систему в течение определенного времени?

denis_lor 09.03.2019 22:43

Можете ли вы обрисовать запрос почтальона в той части, где вы указали заголовки?

denis_lor 09.03.2019 22:43

Можете ли вы подтвердить с помощью отладки или ведения журнала, что строки «email» и «password» — это те, которые, как вы ожидаете, будут передавать механизм входа в систему аутентификации? Можете ли вы также проверить в своем бэкэнде запрос, исходящий от клиента Android, и ожидаете ли вы чего-либо на бэкэнд-уровне с Laravel?

denis_lor 09.03.2019 22:48

первый вопрос :yes , сначала почтальон а потом апи андроид залп. второй вопрос: я не знаю, но я хочу получить токен json, и это не множественный вход в систему, правда!?!

Ramin 09.03.2019 23:02

Проверьте, получаете ли вы что-либо в своем бэкэнде от клиента, и попробуйте проверить, ожидаете ли вы в бэкэнде того, что получаете от внешнего интерфейса (android). Вероятно, проблема связана либо с заголовками, либо имя переменной и пароль могут быть переданы пустыми, неправильными или искаженными, как только они достигнут функции входа в систему (...) в параметрах, или могут быть проблемой в бэкэнде.

denis_lor 09.03.2019 23:06

Хорошо, в Android я проверил emil и passowrd с точкой останова и не возвращает null . и в laravel я проверил, Laravel получил адрес электронной почты и пароль (используя журнал). все в порядке, но после отправки запроса на Android перейдите к Response.ErrorListener() и покажите: com.android.volley.AuthFailureError

Ramin 09.03.2019 23:25

Замечательно. Теперь мы сузили проблему, чтобы быть уверенными в том, как бэкенд ожидает аутентификацию. Ожидает ли код в бэкэнде, что какая-то форма аутентификации произойдет через учетные данные (имя пользователя/пароль), которые будут отправлены через заголовки? Что-то отсутствует в заголовках или неправильно обрабатывается в бэкенде. Попробуйте больше узнать о бэкэнд-части и о том, как она ожидает или когда вызывает ошибку аутентификации.

denis_lor 09.03.2019 23:30

Вы получаете какую-либо ошибку в Laravel?

denis_lor 09.03.2019 23:35

Вероятно, вы получаете в Laravel ошибку типа TokenMismatchException? Попробуйте войти и проверить, так ли это

denis_lor 09.03.2019 23:36

привет, извините за поздний ответ, моя проблема решена. Большое спасибо

Ramin 10.03.2019 10:51

Можешь опубликовать как? Так что другие могут извлечь из этого пользу в будущем! Можете ли вы проверить, является ли способ, которым вы решили, одним из вариантов в моем ответе?

denis_lor 10.03.2019 10:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
17
1 063
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, проблема заключается либо в:

  • заголовки

  • имя переменной и пароль могут быть переданы пустыми, неправильными или искаженными, как только они достигнут функции входа в систему (...)

  • параметры (возможно, вы ожидаете большего от серверной части)
  • может быть проблема в бэкэнде (вероятно, TokenMismatchException, которое относится к заголовку csrf-token, который я вижу в вашем коде Android Java

да, я проверил пароль, вставленный в мое приложение (Android), который был искажен (я понял эту проблему при запросе на сервер с помощью почтальона с паролем и адресом электронной почты, которые были вставлены в приложение (Android), я видел эту ошибку)

Ramin 10.03.2019 13:39

Здорово! Приятно знать, что мы уловили проблему! Удачи!

denis_lor 10.03.2019 17:18

Другие вопросы по теме