Отладка неверного ответа клиента OAuth. Я использую PHP, Laravel5.3, PHPLeague OAuth Client и Guzzle
Позвольте мне начать с спасибо, что нашли время. Я новичок, поэтому дайте мне знать, если вам нужно больше информации.
Поэтому я пытаюсь настроить клиент OAUTH2 в Laravel для подключения к API, предоставленному CLIO. Я использую клиентскую библиотеку PHPLeague OAuth2, которая использует GUZZLE для обработки HTTP.
Мне удалось настроить клиент для перенаправления на страницу авторизации Clio, авторизации доступа, перенаправления в мое приложение и получения кода авторизации.
На следующем шаге, где мне нужно отправить запрос на получение токена доступа, что-то идет не так!
Вот ошибка, которую я получаю:
Ошибка типа: Аргумент 1 передается в League\OAuth2\Client\Provider\AbstractProvider::prepareAccessTokenResponse() должен иметь массив типа, заданная строка, вызываемая в /Users/patrick/Sites/ssacorp/vendor/league/oauth2-client/src/Provider/AbstractProvider.php в строке 565
Теперь, чтобы отследить его, я знаю, что вызывается следующий метод, чтобы начать выборку токена доступа:
public function getAccessToken($grant, array $options = [])
{
$grant = $this->verifyGrant($grant);
$params = [
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
'redirect_uri' => $this->redirectUri,
];
$params = $grant->prepareRequestParameters($params, $options);
$request = $this->getAccessTokenRequest($params);
$response = $this->getParsedResponse($request);
$prepared = $this->prepareAccessTokenResponse($response);
$token = $this->createAccessToken($prepared, $grant);
return $token;
}
Я бросил свойства, и я получаю:
$ Params
array(5) { ["client_id"]=> string(40) "*************************************" ["client_secret"]=> string(40) "************************************" ["redirect_uri"]=> string(26) "http://app.ssadv.org/oauth" ["grant_type"]=> string(18) "authorization_code" ["code"]=> string(20) "******************" }
Так что здесь все кажется нормальным. Я не разделяю эти полномочия, конечно.
$ запрос
object(GuzzleHttp\Psr7\Request)#179 (7) { ["method":"GuzzleHttp\Psr7\Request":private]=> string(4) "POST" ["requestTarget":"GuzzleHttp\Psr7\Request":private]=> NULL ["uri":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Uri)#181 (7) { ["scheme":"GuzzleHttp\Psr7\Uri":private]=> string(4) "http" ["userInfo":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" ["host":"GuzzleHttp\Psr7\Uri":private]=> string(12) "app.clio.com" ["port":"GuzzleHttp\Psr7\Uri":private]=> NULL ["path":"GuzzleHttp\Psr7\Uri":private]=> string(12) "/oauth/token" ["query":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" ["fragment":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" } ["headers":"GuzzleHttp\Psr7\Request":private]=> array(2) { ["Host"]=> array(1) { [0]=> string(12) "app.clio.com" } ["content-type"]=> array(1) { [0]=> string(33) "application/x-www-form-urlencoded" } } ["headerNames":"GuzzleHttp\Psr7\Request":private]=> array(2) { ["content-type"]=> string(12) "content-type" ["host"]=> string(4) "Host" } ["protocol":"GuzzleHttp\Psr7\Request":private]=> string(3) "1.1" ["stream":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Stream)#183 (7) { ["stream":"GuzzleHttp\Psr7\Stream":private]=> resource(262) of type (stream) ["size":"GuzzleHttp\Psr7\Stream":private]=> NULL ["seekable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["readable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["writable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["uri":"GuzzleHttp\Psr7\Stream":private]=> string(10) "php://temp" ["customMetadata":"GuzzleHttp\Psr7\Stream":private]=> array(0) { } } } inside Transfer
$ ответ
Это на самом деле строка, входящая в метод prepareAccessTokenResponse (), который должен быть массивом и вызывает основную ошибку. Дампинг показывает, что на самом деле это HTML-страница 404 от CLIO:
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n
\n
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n
\n
<head>\n
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />\n
<title>The page you were looking for doesn't exist (404)</title>\n
</head>\n
\n
<body>\n
<!-- This file lives in public/404.html -->\n
\n
<div class="dialog">\n
<h1>The page you were looking for doesn't exist.</h1>\n
<p>You may have mistyped the address or the page may have moved.</p>\n
</div>\n
</body>\n
\n
</html>
Я проверил ссылку и параметры в Postman и подтвердил, что маркер доступа действительно возвращается с использованием того же URI и информации в моих $ params. Почему я получаю 404, когда мой URI правильный, а $ request говорит, что использует метод POST, как и должен. Чтобы это подтвердить, я попытался использовать инструмент Chrome Dev Tools Network, но не смог найти POST-вызов этой ссылки. Как еще я должен устранить это, чтобы убедиться, что Guzzle отправляет правильные данные на правильный адрес?
2 ответа
У меня была та же проблема с керлом, что и мне CURLOPT_SSL_VERIFYPEER, false);
Кажется, что проблема была в том, что мне нужно использовать https vs http для запроса POST. Токен предоставлен. Проблема решена.