я пытаюсь получить токен с сервера (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());
}
}
Я проверил клиента с помощью почтальона, это не проблема, и без проблем возвращаю токен.
это скриншот почтальона:
да, я отправил json в таком формате {username:"example", ...} и токен возврата почтальона в формате Json.
Можете ли вы опубликовать точный запрос, который вы отправили в Postman, либо в виде JSON, либо в виде скриншотов, чтобы проверить, как вы отправляете заголовок запроса.
конечно, добавил скрин.
На скриншоте вы загрузили что-то с name, которого нет в вашем java-коде, оно имеет другую конечную точку localhost и /register, вместо этого в java у вас есть 192.168.1.4... и /login. Можете ли вы также показать в своем правильном запросе с почтальоном (я сказал здесь, чтобы посочувствовать, что скриншот не выглядит так же, как код, который вы пытаетесь использовать с Java и Volley), где вы используете заголовки, такие как csrf-token?
Мне очень жаль, я неправильно загрузил скриншот. я изменил на скриншот входа в систему, пожалуйста, проверьте еще раз. о конечной точке localhost: в Android программа должна получить доступ к локальному хосту, используя ip и с ошибкой возврата localhost:8000.
Хорошо! Вы пробовали сначала почтальон, а затем вызов API через залп Android или наоборот, чтобы увидеть, соответствует ли это порядку запросов? Может быть, вы не поддерживаете множественную аутентификацию входа в систему в течение определенного времени?
Можете ли вы обрисовать запрос почтальона в той части, где вы указали заголовки?
Можете ли вы подтвердить с помощью отладки или ведения журнала, что строки «email» и «password» — это те, которые, как вы ожидаете, будут передавать механизм входа в систему аутентификации? Можете ли вы также проверить в своем бэкэнде запрос, исходящий от клиента Android, и ожидаете ли вы чего-либо на бэкэнд-уровне с Laravel?
первый вопрос :yes , сначала почтальон а потом апи андроид залп. второй вопрос: я не знаю, но я хочу получить токен json, и это не множественный вход в систему, правда!?!
Проверьте, получаете ли вы что-либо в своем бэкэнде от клиента, и попробуйте проверить, ожидаете ли вы в бэкэнде того, что получаете от внешнего интерфейса (android). Вероятно, проблема связана либо с заголовками, либо имя переменной и пароль могут быть переданы пустыми, неправильными или искаженными, как только они достигнут функции входа в систему (...) в параметрах, или могут быть проблемой в бэкэнде.
Хорошо, в Android я проверил emil и passowrd с точкой останова и не возвращает null . и в laravel я проверил, Laravel получил адрес электронной почты и пароль (используя журнал). все в порядке, но после отправки запроса на Android перейдите к Response.ErrorListener() и покажите: com.android.volley.AuthFailureError
Замечательно. Теперь мы сузили проблему, чтобы быть уверенными в том, как бэкенд ожидает аутентификацию. Ожидает ли код в бэкэнде, что какая-то форма аутентификации произойдет через учетные данные (имя пользователя/пароль), которые будут отправлены через заголовки? Что-то отсутствует в заголовках или неправильно обрабатывается в бэкенде. Попробуйте больше узнать о бэкэнд-части и о том, как она ожидает или когда вызывает ошибку аутентификации.
Вы получаете какую-либо ошибку в Laravel?
Вероятно, вы получаете в Laravel ошибку типа TokenMismatchException? Попробуйте войти и проверить, так ли это
привет, извините за поздний ответ, моя проблема решена. Большое спасибо
Можешь опубликовать как? Так что другие могут извлечь из этого пользу в будущем! Можете ли вы проверить, является ли способ, которым вы решили, одним из вариантов в моем ответе?




Вероятно, проблема заключается либо в:
заголовки
имя переменной и пароль могут быть переданы пустыми, неправильными или искаженными, как только они достигнут функции входа в систему (...)
csrf-token, который я вижу в вашем коде Android Javaда, я проверил пароль, вставленный в мое приложение (Android), который был искажен (я понял эту проблему при запросе на сервер с помощью почтальона с паролем и адресом электронной почты, которые были вставлены в приложение (Android), я видел эту ошибку)
Здорово! Приятно знать, что мы уловили проблему! Удачи!
Можете ли вы показать, как вы делаете запрос в почтальоне?