Я использую HTTP-клиент guzzle для выдачи токена доступа на основе предоставления пароля после успешного входа пользователя. Я использую паспортный пакет для oauth, и я выполнил все настройки, которые включает в себя созданный клиент Password Grant. В моем контроллере входа я переопределяю метод sendLoginResponse
черты AuthenticatesUsers
, чтобы выдать токен доступа при успешной аутентификации по электронной почте / паролю
public function sendLoginResponse(Request $request)
{
try {
Log::debug("Auth attempt sucessful, obtaining access_token for user :: ".$request->email);
$client = new Client();
$token_response = $client->post(config('app.url').'/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => config('auth.password_grant.client.id'),
'client_secret' => config('auth.password_grant.client.secret'),
'username' => $request->email,
'password' => $request->password,
'scope' => '*',
],
]);
if($token_response->getStatusCode()!=200) {
Log:error("Login failed to generate Access Token");
throw new InvalidCredentialsException();
}
$request->session()->regenerate();
$this->clearLoginAttempts($request);
$data = json_decode((string) $token_response->getBody(), true);
Cookie::queue('refresh_token',$data->refresh_token,config('auth.tokens.refresh.expire.days')*1440);
Log::debug("Adding Bearer token to Authorization header");
return response()->view('dashboard', [
'expires_in' => $data->expires_in
], 200)->header('Authorization', $data->token_type.' '.$data->access_token);
} catch(Exception $e){
Log::error('Error :: '.$e->getMessage());
throw $e;
}
}
Весь процесс PHP перестает отвечать на запросы, когда я делаю этот пост-запрос, и ни в одном из журналов нет ошибок. Именно на этой линии
$token_response = $client->post($token_url, .......
Я запустил это в сеансе отладки; и URL, идентификатор клиента и секрет генерируются правильно через свойства конфигурации; единственное исключение, которое я мог видеть, это FileNoFoundException
, который возникает, когда он находит какой-либо ключ кеша для входа в дроссель, и все это происходит задолго до того, как сделан этот вызов, и приложение переходит к аутентификации пользователя.
Когда я делаю этот самый запрос с теми же параметрами через Почтальона или через artisan
tinker
, я могу получить ответ с данными access_token
, refresh_token
и expires_in
.