Utilisation class http.com.php

Hello, je test de mettre en place la class http.com.php mais j’ai un petit soucis, que je n’arrive pas à résoudre

$data = [
            'client_id='.base64_decode(self::CLIENT_ID).
            '&user_prefix=muller'.
            '&client_secret='.base64_decode(self::CLIENT_SECRET).
            '&grant_type=password'.
            '&scope=read_muller write_muller'.
            '&password='.$password.
            '&username='.$username
        ];
        $request_http = new com_http(self::URL . '/oauth2/token');
        $request_http->setHeader([
            'Content-Type: application/x-www-form-urlencoded'
        ]);
        $request_http->setPost($data);

        return json_decode($request_http->exec(), true);

Déjà je ne sais pas si c’est correcte ce que j’ai fait ? si c’est le cas je me retrouve avec l’erreur suivante invalid_client

Sachant que ça fonctionne avec le code de Guzzle qui se traduit comme ça :

return $this->client->request('POST', self::URL . '/oauth2/token', [
            'form_params' => [
                'client_id' => base64_decode(self::CLIENT_ID),
                'user_prefix' => 'muller',
                'client_secret' => base64_decode(self::CLIENT_SECRET),
                'grant_type' => 'password',
                'scope' => 'read_muller write_muller',
                'password' => $password,
                'username' => $username
            ]
        ]);

Merci d’avance
Cordialement

Salut,

Une question / demande d’aide = un post;
ici c’est pas vmt une question en lien avec le core 4.5 :wink:


pourquoi envoyer une chaine type querystring?

pcq ca n’a rien d’un POST valide ca d’où l’erreur que tu reçois (du remote host)

envoies un tableau comme avant non? il sera encodé json lors de l’envoi

Hello,

J’ai déjà utilisé en forme de tableau, j’ai ça comme retour

result = {string[2]} ["invalid_request", "Invalid grant_t..."]
 error = "invalid_request"
 error_description = "Invalid grant_type parameter or parameter missing"

Car les data ce n’est pas du JSON, j’envoie une chaîne comme indiqué dans la doc de CURL car http.com.php utilise CURL c’est du Content-Type: application/x-www-form-urlencoded

Même en utilisant

$request_http->setPost(json_encode($data));

Petite info : je suis en Debian12 & php 8.2

je viens de relire le code, le json_encode est pas fait donc oui à toi de le faire

oui, je me demande pq tu as fait ca
il ne me semble pas que c’est ce que fait guzzle, si?

Si justement guzzle quand il voit form_params = Content-Type: application/x-www-form-urlencoded c’est ce qu’il fait

La documentation de Guzzle Request Options — Guzzle Documentation
Pour l’utilisation de CURL curl POST examples · GitHub

just form_params tu veux dire?

pcq c’est ca qui est pas clair, tu n’as pas spécifié ceci

à guzzle, en tout cas pas dans le bout de code que tu nous montres

et ton api elle supporte que des form params? c’est pas vmt fait pour être utilisé en api alors?
un end point oauth2/token en principe ca supporte un payload json

btw, tu ne peux pas utiliser autre chose qu’un grant_type password? c’est pas super… ca force à utiliser le password du user; c’est pas le but de oauth2

il existe des lib qui gère oauth pour toi sinon au lieu de gérer les messages toi même, par exemple league/oauth2-client justement

Bonjour,
Le problème c’est que je ne saisis pas bien sous quelle forme tu veux envoyer $data.
Si c’est application/json alors ce doit être une array exactement comme celle que tu as mis dans ton exemple Guzzle (pas celle de ton essai avec http_com) et tu dois faire

$request_http->setPost(json_encode($data));

Mais si c’est application/x-www-form-urlencoded ce ne dois pas du tout être un array mais une string or toi dans ton exemple tu as mis des crochets autour de ta string donc çà ne peut pas marcher. De plus pour construire la chaine tu peux utiliser http_build_query c’est plus pratique.

$data = http_build_query([
                'client_id' => base64_decode(self::CLIENT_ID),
                'user_prefix' => 'muller',
                'client_secret' => base64_decode(self::CLIENT_SECRET),
                'grant_type' => 'password',
                'scope' => 'read_muller write_muller',
                'password' => $password,
                'username' => $username
            ]);
$request_http->setHeader([
            'Content-Type: application/x-www-form-urlencoded'
        ]);
$request_http->setPost($data);
1 « J'aime »

@Mips

Oui

Non, j’ai du json aussi

Oui, pour le premier appel comme Netatmo en gros il utilise leur API ensuite j’ai un refresh_token dans le grant_type

@vedrine comme expliqué plus haut oui c’est un string qu’il faut envoyer car c’est du application/x-www-form-urlencoded

Apparemment, ce n’est pas gérer par Jeedom :frowning:

Merci ça passe avec http_build_query

Merci à vous 2

Si tu peux envoyer du json pq tu fais pas ça plutôt qu’un form params?

Si, mais tu as mis des crochets autour, donc tu as envoyé un array avec un élément comme l’a remarqué @vedrine

Pas possible car le form_params c’est ce style de format string

'client_id='.base64_decode(self::CLIENT_ID).'&user_prefix=muller&client_secret='.base64_decode(self::CLIENT_SECRET).'&grant_type=password&scope=read_muller write_muller&password='.$password.'&username='.$username

Avec des & après chaque valeur.

Je viens de voir d’ou vient le soucis en gros c’est l’encodage que fait http_build_query par exemple il remplace les @ par %40 alors que si je le balance directement en string @ reste un @ donc ça ne fonctionne pas

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.