Это связано с Laravel 5.4 и предоставлением паспортного пароля.
У меня есть маршруты для получения access_token для пользователя, который работает полностью нормально.
У меня также есть маршрут для обновления токена, если текущий токен истекает.
Когда я использую Почтальон, чтобы отправиться в путь
http://192.168.10.10/refresh
Я получаю это обратно, который действителен:
"data": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOi...deleting most of it.",
"expires_in": 600
}
Однако, когда я выбираю маршрут из браузера, используя axios через этот код:
let headers = { 'Content-type': 'application/json' }
return axios.post("http://192.168.10.10/refresh", {headers: headers}).then(res => {
if (res) return res;
}).catch(err => {
if (err) return err.response;
});
Я получаю код ошибки HTTP 500.
Я также отслеживаю ошибки в журнале Laravel, и это трассировка стека.
[2017-08-30 07:21:41] local.ERROR: GuzzleHttp \ Exception \ ClientException: ошибка клиента:POST http://192.168.10.10/oauth/token
привело к 400 Bad Request
ответ:Другая часть этой ошибки состоит в том, что это может быть искаженное значение.
Это не имеет смысла для меня, и я попробовал все, начиная с запросов curl непосредственно из кода PHP, а также использовал функциональность http_query_builder.
Cache-Control →no-cache, private
Connection →keep-alive
Content-Type →application/json
Это то, что установлено на Почтальон с просьбой. Я также отправляю эти заголовки из браузера. Любые идеи о том, что может быть причиной проблемы? Это сводит меня с ума.
public function refreshToken(Request $request)
{
if (!is_null($request)) {
$refreshToken = $request->cookie(self::REFRESH_TOKEN);
$http = new Guzzle();
$response = $http->request('POST','http://192.168.10.10/oauth/token', [
'form_params' => [
'grant_type' => 'refresh_token',
'refresh_token' => $refreshToken,
'client_id' => env("PASSWORD_GRANT_CLIENT_ID"),
'client_secret' => env("PASSWORD_GRANT_SECRET"),
'scope' => '',
]
]);
$data = json_decode($response->getBody());
$this->cookie->queue(
self::REFRESH_TOKEN,
$data->refresh_token,
864000, // 10 days
null,
null,
false,
true // HttpOnly
);
return response()->json([
'payload' => [
'access_token' => $data->access_token,
'expires_in' => $data->expires_in
]
]);
} else {
return response()->json("Could not refresh token", 401);
}
}
А вот и контент для запроса почтальона.
ЗДЕСЬ, ГДЕ Я ВНУШЕН.
Никакие параметры не передаются через этот запрос POST.
CORS включен на моем API, не получая ошибки перед полетом.
Заголовки одинаковы для обоих запросов.
Разница лишь в том, что используется Почтальон и Аксиос.
Ничего не меняется, кроме того, где делается запрос, через Почтальон или браузер.
Задача ещё не решена.
Других решений пока нет …