apidae-tourisme / apidae-php

Official API to access Apidae touristic data
http://www.apidae-tourisme.com/
MIT License
36 stars 16 forks source link

Authentification SSO ne fonctionne plus sur 1.0.5 #12

Closed ghost closed 3 years ago

ghost commented 5 years ago

Plusieurs problèmes se posent, vraisemblablement liés au commit : https://github.com/apidae-tourisme/sitra-api-php/commit/7a74125d8373b40e357f6850829546b22b1efdbe

Il semble qu'il manque des classes (notamment une Sitra\ApiClient\MiddleWare\AuthenticationHandler) en plus de diverses erreurs de code, dont certaines ont été corrigées.

Absence de la classe AuthenticationHandler

Pour commencer, l'appel à $client->getSsoUrl() déclenche une erreur :

Si on passe cette erreur en générant l'URL à la main on rencontre au minimum 2 autres erreurs.

Appel de SitraException avec une instance de CommandClientException

https://github.com/apidae-tourisme/sitra-api-php/blob/master/src/Sitra/ApiClient/Client.php#L288

if ($e instanceof CommandClientException) { throw new SitraException($e); }

Alors que le constructeur de SitraException n'autorise que les RequestException : https://github.com/apidae-tourisme/sitra-api-php/blob/master/src/Sitra/ApiClient/Exception/SitraException.php#L13

public  function  __construct(RequestException  $e)

Fatal error: Uncaught TypeError: Argument 1 passed to Sitra\ApiClient\Exception\SitraException::__construct() must be an instance of GuzzleHttp\Exception\RequestException, instance of GuzzleHttp\Command\Exception\CommandClientException given, called in /vendor/sitra-tourisme/sitra-api-php/src/Sitra/ApiClient/Client.php on line 289 and defined in /vendor/sitra-tourisme/sitra-api-php/src/Sitra/ApiClient/Exception/SitraException.php:13`

L'URL appelée renvoie une erreur 400

Fatal error: Uncaught GuzzleHttp\Exception\ClientException: Client error: GET https://base.apidae-tourisme.com/oauth/token?grant_type=authorization_code&code=so4fWL&redirect_uri=[...] resulted in a 400 Bad Request response:  in /home/apidae/httpdocs/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:113

Voir fichier examples/sso.php pour les tests.

mickael-adaka commented 5 years ago

J'ai le même dysfonctionnement de mon côté. Il semblerait que la classe Middleware/AuthenticationHandler ait migrée vers Subscriber/AuthenticationSubscriber

Mais si je change use Sitra\ApiClient\Middleware\AuthenticationHandler; pour use Sitra\ApiClient\Subscriber\AuthenticationSubscriber; dans le fichier ApidaeSerializer.php, je me retrouve avec une nouvelle erreur Uncaught Error: Call to undefined method GuzzleHttp\Psr7\Response::json()

Qu'en ait-il de cette issue qui date déjà un petit peu ?

ghost commented 5 years ago

Bonjour,

J'avais jeté un oeil de mon côté, mais malheureusement je ne connais pas suffisament Guzzle pour arriver à corriger ça, d'autant que ce n'est pas le seul problème posé par le commit https://github.com/apidae-tourisme/sitra-api-php/commit/7a74125d8373b40e357f6850829546b22b1efdbe

Eventuellement vous pouvez jeter un oeil ici : https://github.com/PGranger/ApidaeSso où vous trouverez une classe très simpliste pour l'authentification SSO avec un exemple très simple dans /tests/ : https://github.com/PGranger/ApidaeSso/blob/master/tests/sso.php

Ce n'est pas une classe officielle Apidae mais je m'en sers de mon côté, tout a l'air de fonctionner correctement. ça peut dépanner en attendant la correction des différents bugs sur sitra-php-api.

mickael-adaka commented 5 years ago

Ok, merci pour l'information, je vais regarder cela en attendant.

Merci beaucoup

lalmeras commented 5 years ago

Cela ressemble effectivement à un reste de Guzzle 5 (cf https://github.com/guzzle/guzzle/issues/1106). Remplacer l'appel ->json de la manière suivante devrait fonctionner.

            $tokenResponse = GuzzleHttp\json_decode($this->client->get('/oauth/token', [
              'auth' => [
                $this->config['OAuthClientId'],
                $this->config['OAuthSecret'],
              ],
              'query' => [
                'grant_type' => 'client_credentials',
              ],
              'headers' => [
                'accept' => 'application/json',
              ],
            ])->getBody(), true);