#php #oauth-2.0 #access-token
#php #oauth-2.0 #токен доступа
Вопрос:
В настоящее время я работаю над веб-функцией, которая представляет собой реализацию сервера oauth2 через phpleague. Я думаю, что я хорошо поработал над дизайном своего сервера, но я не знаю, почему клиент выводит ошибку, которую я не понимаю.
Мой клиентский код:
lt;?php require 'vendor/autoload.php'; $provider = new LeagueOAuth2ClientProviderGenericProvider([ 'clientId' =gt; '1', // The client ID assigned to you by the provider 'clientSecret' =gt; 'haha', // The client password assigned to you by the provider 'redirectUri' =gt; 'http://localhost:4444/callback.php', 'urlAuthorize' =gt; 'http://localhost:1337/authorize', 'urlAccessToken' =gt; 'http://localhost:1337/access_token', 'urlResourceOwnerDetails' =gt; 'https://service.example.com/resource' ]); // If we don't have an authorization code then get one if (!isset($_GET['code'])) { // Fetch the authorization URL from the provider; this returns the // urlAuthorize option and generates and applies any necessary parameters // (e.g. state). $authorizationUrl = $provider-gt;getAuthorizationUrl(); // Get the state generated for you and store it to the session. $_SESSION['oauth2state'] = $provider-gt;getState(); // Redirect the user to the authorization URL. header('Location: ' . $authorizationUrl); exit; // Check given state against previously stored one to mitigate CSRF attack } elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) amp;amp; $_GET['state'] !== $_SESSION['oauth2state'])) { if (isset($_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); } exit('Invalid state'); } else { try { // Try to get an access token using the authorization code grant. $accessToken = $provider-gt;getAccessToken('authorization_code', [ 'code' =gt; $_GET['code'] ]); // We have an access token, which we may use in authenticated // requests against the service provider's API. echo 'Access Token: ' . $accessToken-gt;getToken() . "lt;brgt;"; echo 'Refresh Token: ' . $accessToken-gt;getRefreshToken() . "lt;brgt;"; echo 'Expired in: ' . $accessToken-gt;getExpires() . "lt;brgt;"; echo 'Already expired? ' . ($accessToken-gt;hasExpired() ? 'expired' : 'not expired') . "lt;brgt;"; // Using the access token, we may look up details about the // resource owner. $resourceOwner = $provider-gt;getResourceOwner($accessToken); var_export($resourceOwner-gt;toArray()); // The provider provides a way to get an authenticated API request for // the service, using the access token; it returns an object conforming // to PsrHttpMessageRequestInterface. var_dump($access_token); } catch (LeagueOAuth2ClientProviderExceptionIdentityProviderException $e) { // Failed to get the access token or user details. exit($e-gt;getMessage()); } }
Ошибка в обратном вызове при вызове getAccessToken.
Вот трассировка стека:
Fatal error: Uncaught UnexpectedValueException: Failed to parse JSON response: Syntax error in /opt/lampp/htdocs/oauth2_client/vendor/league/oauth2-client/src/Provider/AbstractProvider.php:645 Stack trace: #0 /opt/lampp/htdocs/oauth2_client/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(686): LeagueOAuth2ClientProviderAbstractProvider-gt;parseJson() #1 /opt/lampp/htdocs/oauth2_client/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(626): LeagueOAuth2ClientProviderAbstractProvider-gt;parseResponse() #2 /opt/lampp/htdocs/oauth2_client/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(537): LeagueOAuth2ClientProviderAbstractProvider-gt;getParsedResponse() #3 /opt/lampp/htdocs/oauth2_client/callback.php(43): LeagueOAuth2ClientProviderAbstractProvider-gt;getAccessToken() #4 {main} thrown in /opt/lampp/htdocs/oauth2_client/vendor/league/oauth2-client/src/Provider/AbstractProvider.php on line 645
Я не понимаю, почему у меня эта ошибка…
Комментарии:
1. Ответ, возвращаемый из API, не является JSON. Поэтому он не может быть проанализирован как JSON.
Ответ №1:
Я исправил ошибку. Когда я отправляю запрос на свой access_token, я замечаю ошибку, поэтому, когда мой клиент отправляет запрос post и анализирует json, это вызывает ошибку при анализе, потому что он пытается проанализировать ошибку непосредственно в строку, которая не находится в формате json