GROS_FAIGNAN Posté(e) le 16 décembre 2019 Partager Posté(e) le 16 décembre 2019 bonjour je cherche a mettre en oeuvre une procedure d'identification entre l'API d'un site web et un script logicielle ou un script HTML, chose que je n'ai jamais faite. j'ai la doc de l'API mais j'aurais besoin d'un coup de main pour la comprendre et la mettre en oeuvre : https://developer.digikey.com/documentation/oauth si qqun peut m'aider. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sheepux Posté(e) le 16 décembre 2019 Partager Posté(e) le 16 décembre 2019 Ce n'est pas "juste une API", c'est une authentification OAuth. Donc se renseigner en profondeur sur OAuth car c'est compliqué (pour tout implémenter, le refresh etc...) et surtout utiliser une lib qui fera le boulot exemple (entre autre) https://github.com/andreassolberg/jso Mais autant utiliser la lib OAuth de ton framework frontend s'il le gére déja Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 16 décembre 2019 Auteur Partager Posté(e) le 16 décembre 2019 c'est quoi mon framework frontend exactement ? ma connexion peut se faire soit via un script HTML/PHP sur un serveur distant, sois depuis un script executé par une appli en local, qu'est ce qui serait le plus facile a mettre en oeuvre ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 16 décembre 2019 Auteur Partager Posté(e) le 16 décembre 2019 [EDIT] j'ai essayer une autre option j'utilise ce bout de code php adapté d'un code qui fonctionne sur une autre page pour recuperer les infos dont j'ai besoin, je fait un essaye avec une page quelquonque sur le site qui m'interesse (digikey) <?php $adresse = "https://www.digikey.fr/product-detail/fr/skyworks-solutions-inc/SMV1249-079LF/863-1137-2-ND/2052147"; $page = file_get_contents ($adresse); $qté; preg_match_all("|<[div id=quantityAvailable]+>(.*)<[^>]+>|U",$page, $qté);// ont cherche les balise de quantitée var_dump($qté); // ont dump la variable pour verifier que le code fonctionne /*for($i = 0; $i < count($prix[1]); $i++) // On parcourt le tableau $prix[1] { echo $prix[1][$i]; // On affiche le prix }*/ ?> le probleme c'est qu'ici stdout me renvoie cette erreur : Warning: file_get_contents(https://www.digikey.fr/product-detail/fr/skyworks-solutions-inc/SMV1249-079LF/863-1137-2-ND/2052147): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in C:\wamp64\www\PrTest\test.php on line 4 comment contourné le blocage de la fonction file_get_content qui je suppose a du être bloqué volontairement ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 17 décembre 2019 Auteur Partager Posté(e) le 17 décembre 2019 personne ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 17 décembre 2019 Auteur Partager Posté(e) le 17 décembre 2019 j'ai fini par trouver un tuto qui me semble intéressant pour démarrer, https://www.youtube.com/watch?v=I5tFlK5PPjc , pour l'instant j'ai reussi a realiser les parties suivantes : enregistrement et recuperation des identifiant (CLIENT_ID & CLIENT_SECRET) sur les services de googlesapi.com creation de mes debut de pages php (elle sont ok) lorsque je clique sur mon bouton se connecter avec google sur ma page php j'ai bien la page google qui s'affiche j'ai bien un token qui s'afficche sur ma page connect (ma REDIRECT_URI) et à’étape suivante les requêtes insomnia fonctionnent. et je recupere bien la clef d'authentification le problème vient ensuite (~vers la minute 19 du tuto) je dois installé les paquet symfony/var-dump (fait) et guzzlehttp/guzzle:6.3.3 (fait aussi) mais une fois que ces paquet sont installé dans mon dossier sous-projet (www/projet/sous-projet), plus rien ne marche, les fonctions symfony et guzzle ne sont pas reconnues et pires les fonction php (type var_dump()) ne sont plus reconnues non plus si qqun peut m'aider ...^^ [EDIT] non c'est bon j'ai trouvé, une erreur de syntaxe a la con; Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 18 décembre 2019 Auteur Partager Posté(e) le 18 décembre 2019 voici mes fichier je l'es ai ecrit tel que dans la video : il fonctionne a ceci prêt que : 1) je doit ajouté un require 'secret.php' dans mon fichier connect , sinon j'ai une erreur de type : Citer Not Found The requested URL /secret.php was not found on this server. 2) une fois que c'est fait si je veut supprimé les erreur résiduelle je doit virer la partie session_start() en bas du fichier connect 3) ceci etant j'ai l'impression que la partie session_start() doublon en bas de la page connect.php fait doublon avec la partie session_start() de la page secret.php voici le code login.php (page d'accueuil avec le bouton de connection) : <?php require('config.php') ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X_UA-Compatible" content="id=edge"> <title>Essais OAuth</title> </head> <body> <h1> Se Connecter</h1> <p> <a href="https://accounts.google.com/o/oauth2/v2/auth?scope=email&access_type=online&redirect_uri=<?= urlencode('http://localhost/PrTest/OAuth2_test/connect.php') ?>&response_type=code&client_id=<?=GOOGLE_ID ?>">Se connecter via Google</a> </p> </body> </html> la page config.php qui contien mes clef et id <?php define('GOOGLE_ID','mon_identifiant_googleqqe je n'affiche pas ici'); define('GOOGLE_SECRET', 'mon_code_secret_google_que je n'affiche pas ici'); ?> la page connect.php qui se charge de l'atablissement de la connection OAuth avec google <?php require __DIR__.'\vendor\autoload.php'; require 'config.php'; require 'secret.php'; use GuzzleHttp\Client; $client = new Client([ // You can set any number of default request options. 'timeout' => 2.0, //verification du certificat (téléchargé préalablement sur curl.haxx.se) certificat concernant curl 'verify'=>__DIR__.'/cacert.pem' ]); try { $response =$client->request('GET','https://accounts.google.com/.well-known/openid-configuration'); $discoveryJSON = json_decode((string)$response->getBody()); $tokenEndpoint = $discoveryJSON->token_endpoint; $userInfoEndpt = $discoveryJSON->userinfo_endpoint; $response = $client->request('POST',$tokenEndpoint, [ 'form_params' => [ 'code'=>$_GET['code'], 'client_id'=> GOOGLE_ID, 'client_secret' =>GOOGLE_SECRET, 'redirect_uri' =>'http://localhost/PrTest/OAuth2_test/connect.php', 'grant_type' => 'authorization_code' ] ]); $accessToken = json_decode($response->getBody())->access_token; $response = $client->request('GET', $userInfoEndpt, [ 'headers' => [ 'Authorization' =>'Bearer' . $accessToken ] ]); $response = json_decode($response->getBody()); if($response->email_verified === true) { //-----partie a virer si je veut que le connect n'est pas de warning php-----// /*session_start(); $_SESSION['email'] = $response->email; header('Location: /secret.php'); exit();*/ //---------------------------------------------------------------------------// } } catch(\GuzzleHttp\Exception\ClientException $exception) { dump($exception->getMessage()); } ?> la page secret.php <?php require 'vendor/autoload.php'; session_start(); if (!isset($_SESSION['email'])) { header('location: login.php'); exit(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X_UA-Compatible" content="id=edge"> <title>equivalent page secrete tuto https://www.youtube.com/watch?v=I5tFlK5PPjc </title> </head> <body> <h1> cette page ne devrait pas etre accessible</h1> <?php dump($_SESSION) ?> </body> </html> Lien vers le commentaire Partager sur d’autres sites More sharing options...
CryoGen Posté(e) le 18 décembre 2019 Partager Posté(e) le 18 décembre 2019 Vu le contenu de la page secret.php je dirais qu'elle ne doit pas être incluse via "require" dans le connect.php. C'est une page au même titre que login.php. Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 18 décembre 2019 Auteur Partager Posté(e) le 18 décembre 2019 faudrait l'inclure via quelle fonction ? a l'origine elle est censée être incluse via un passage de paramètres dans le header $_SESSION['email'] = $response->email; header('Location: /secret.php'); (en bas de la page connect) mais chez moi ca ne fonctionne pas (alors que sur la machine du tutorant c'est ok... d'ailleur ^^) j'ai une erreur de type "header already sent" [EDIT] ou deplacement de la fonction header autre part dans le code (pourtant a cette endroit ca a l'air pratique) Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 18 décembre 2019 Auteur Partager Posté(e) le 18 décembre 2019 c'est bon j'ai trouver ou était le problème header('Location: http://localhost/OAuth2_TEST/secret.php'); il fallait codé la ligne en entier et pas en relatif. et du coup pas besoin du require et le session_start() fonctionne bien Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 18 décembre 2019 Auteur Partager Posté(e) le 18 décembre 2019 le code est disponible ici https://github.com/grosfaignan/OAuth2_TEST et est fonctionnel sur windows 10 si certain veulent me corriger ou me donnée des idées, il peuvent le faire ^^ le fichier config contenant les identifiants et clefs privées n'est pas disponible, rendez vous sur https://console.cloud.google.com/apis , section identifant Lien vers le commentaire Partager sur d’autres sites More sharing options...
Minikea Posté(e) le 18 décembre 2019 Partager Posté(e) le 18 décembre 2019 Il y a 58 minutes, GROS_FAIGNAN a écrit : c'est bon j'ai trouver ou était le problème header('Location: http://localhost/OAuth2_TEST/secret.php'); il fallait codé la ligne en entier et pas en relatif. et du coup pas besoin du require et le session_start() fonctionne bien et pour info, pour envoyer des headers en php, il faut le faire le moindre envoi de code html (et ça comprend un espace ou un saut de ligne avant la balise <php>). c'est très con mais c'est utile de le savoir! Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 19 décembre 2019 Auteur Partager Posté(e) le 19 décembre 2019 je suppose que ton explication doit correspondre a ceci : https://www.php.net/manual/fr/function.header.php (les commentaire avant le header crées des problèmes ^^ etc...) oui effectivement cette partie je ne l'ai pas encore correctement assimilée: part contre la ou je peche un peut c'est dans la comprenhesion de ma fonction $response = $client->request('POST',$tokenEndpoint, [ 'form_params' => [ 'code'=>$_GET['code'], 'client_id'=> GOOGLE_ID, 'client_secret' =>GOOGLE_SECRET, 'redirect_uri' => $URI, 'grant_type' => 'authorization_code' ] ]); 1) la partie 'code' =>$_GET['code'] , je vois pas du tout comment elle fonctionne : ou vas t'elle le chercher ce 'code' et puis c'est quoi d'ailleur ce code , pas le $tokenEndpoint vue que celui ci est passé en parametre de la fonction. donc ca doit etre le code d'autentification retourné par l'api... 2) l'uri passé en parametre et correspond a l'url de la page dans laquelle est codée la fonction client->request() $currentFolder = "http://localhost/OAuth2_TEST/";//a deplacer en variable d'environnement $URI =$currentFolder.'connect.php'; un peut bizarre Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 19 décembre 2019 Auteur Partager Posté(e) le 19 décembre 2019 bon j'ai commencer a ecrire le code pour l'API qui m'interesse : connexion sur l'API de digikey tout marche bien au debut : je recupere accessToken et refreshToken facilement je fait un essais via leur "trying tool" (https://developer.digikey.com/products/product-information/partsearch/productdetails?prod=truehttps://developer.digikey.com/products/product-information/partsearch/productdetails?prod=true) et ca marche aussi j'ai bien le bon résultat. mais ensuite c'est la que ca ce gate, lorsque j'essais d'obtenir le meme resultat via insomnia ou en php, ... pas moyen soit des erreur timed out soit des erreur connection refused soit des erreur connexion impossible voici le code en question : $response = $client->request('GET', 'sandbox-api.digikey.com/Search/v3/Products/'.$DPN, [ 'headers' => [ 'X-DIGIKEY-Client-Id'=> DIGIKEY_ID, 'Authorization'=>'Bearer '.$accessToken, 'X-DIGIKEY-Locale-Site'=> 'FR', 'X-DIGIKEY-Locale-Language'=> 'fr', 'X-DIGIKEY-Locale-Currency'=> 'EUR', 'X-DIGIKEY-Locale-ShipToCountry'=> 'fr', 'X-DIGIKEY-Customer-Id'=> 0 ] ]); $response = json_decode($response->getBody()); dump($response); voici le message d'erreur : Citer GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to sandbox-api.digikey.com port 80: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in C:\wamp64\www\OAuth2_DIGIKEY\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 185 sur le site de guzzle ont me dit qu'une error 7 = "CURLE_COULDNT_CONNECT (7) Failed to connect() to host or proxy." en gros "...ca marche pas" qqun aurait une idée de la direction dans laquelle cherchée ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
CryoGen Posté(e) le 19 décembre 2019 Partager Posté(e) le 19 décembre 2019 J'ai l'impression que l'API doit être attaquée en HTTPS (donc port 443) et non HTTP (port 80) comme tu le fais. Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 19 décembre 2019 Auteur Partager Posté(e) le 19 décembre 2019 comme dit la doc : Developer application example request (Sandbox) Example request to PartSearch using developer credentials and endpoint (sandbox-api.digikey.com) : GET /Search/v3/Products/p5555-nd HTTP/1.1 Host: sandbox-api.digikey.com X-DIGIKEY-Client-Id: WugAd2A6Lxy3Eu3Mgvov45KUNoguMoUl Authorization: Bearer StgGLw9b3hkwqlWAGBmdYoBNEokm X-DIGIKEY-Locale-Site: US X-DIGIKEY-Locale-Language: en X-DIGIKEY-Locale-Currency: USD X-DIGIKEY-Locale-ShipToCountry: us X-DIGIKEY-Customer-Id: 0 il precise http/1.1 donc j'aurais tendance a dire que non mais peut etre , juste a rajouté le port dans mon URL de destination ? si c'est ca (style api.url:443) j'ai tenter le coup et ca marche pas : error 52 empty response une erreur de certificat ? j'ai mis le meme que celui que j'utilise avec google [EDIT] non c'est ca, fallait juste entrer. https://api.url... ca fonctionne nickel ... merci Cryo 😉 [EDIT] me reste a mettre en place éventuellement le refresh token, mais question avant toute chose. comment puis-je "contourné" la partie "acceptation utilisateur" (par clique de souris j'entend. je m'explique, le code php de connexion a l'API va être exécuté sur un serveur distant qui va ouvrir une connexion chez digikey, et transmettre des infos, mais possiblement plusieurs fois par heure. mon serveur va lui transmettre des infos a un script exécuté sur une application et elle meme connecter a mon serveur. les infos récupérer chez digikey en font partie et sont a la demande de l'utilisateur final. et cet utilisateur n'as aucun rapport avec le compte digikey en question et ne devrait donc logiquement pas avoir d'acceptation a faire . et comme c'est de toute façon mon serveur qui se connecte chez digikey il serait plus simple que cette acceptation soit automatique. a moins de lancer la première connexion manuellement puis de faire un refresh token toute les 25 minute (30 min de validité le tokent digi) je vois pas, et je trouve ca pas terrible. comment faire ... une idée ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
CryoGen Posté(e) le 19 décembre 2019 Partager Posté(e) le 19 décembre 2019 Ton edit est incompréhensible. Si c'est ton serveur qui initie la connexion, à quel moment tu peux avoir un dialogue quelconque pour interagir avec l'utilisateur et lui demander un consentement ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Minikea Posté(e) le 19 décembre 2019 Partager Posté(e) le 19 décembre 2019 Il y a 9 heures, GROS_FAIGNAN a écrit : 1) la partie 'code' =>$_GET['code'] , je vois pas du tout comment elle fonctionne : ou vas t'elle le chercher ce 'code' et puis c'est quoi d'ailleur ce code , pas le $tokenEndpoint vue que celui ci est passé en parametre de la fonction. donc ca doit etre le code d'autentification retourné par l'api... $_GET['code'] c'est en fait le paramètre "code" que tu donnes quand tu passes l'url. par exemple: http://localhost/OAuth2_TEST/connect.php?code=tata Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 19 décembre 2019 Auteur Partager Posté(e) le 19 décembre 2019 Il y a 9 heures, Minikea a écrit : $_GET['code'] c'est en fait le paramètre "code" que tu donnes quand tu passes l'url. par exemple: http://localhost/OAuth2_TEST/connect.php?code=tata non ca y'es j'ai pigé ce que je comprenais pas, comme le code est passé en parametre de la page connect.php il est disponible sur celle ci et pas sur login.php Citer Si c'est ton serveur qui initie la connexion, à quel moment tu peux avoir un dialogue quelconque pour interagir avec l'utilisateur et lui demander un consentement ? bah justement >> nulle part Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 20 décembre 2019 Auteur Partager Posté(e) le 20 décembre 2019 est ce que je doit chercher autre part que les API ? qu'est ce que je pourrais trouver d'autre part ce que parser le site pour recup les infos qui m'interesse ca me parrait pas top, et d'autant plus que pour l'instant ca a pas l'air de marcher des masse. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Minikea Posté(e) le 20 décembre 2019 Partager Posté(e) le 20 décembre 2019 j'imagine que c'est parce que le but premier de l'API, c'est d'avoir une interaction utilisateur. ce que tu veux faire, ça détourne du cas d'usage standard. Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 20 décembre 2019 Auteur Partager Posté(e) le 20 décembre 2019 humhum, j'avais toujours penser que le but d'une api etant la communication interserveur a profit d'une requete client, mais apparament ca se resueme plus a OAuth qu'a autre chose. comment recuperer les infos qui m'interesse sans utiliser l'api. j'ai tenter de parser le site mais pour l'instant en dehors des erreur de parse et des probleme de maintenance du code que ca va engendrer, j'ai des erreur 403 (forbidden acces) qui ne facilite pas les chose. une autre solution que les API et la parse html pour recuperer les données qui m'interesse ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Minikea Posté(e) le 20 décembre 2019 Partager Posté(e) le 20 décembre 2019 ta seul interaction utilisateur actuelle c'est ça? <a href="https://accounts.google.com/o/oauth2/v2/auth?scope=email&access_type=online&redirect_uri=<?= urlencode('http://localhost/PrTest/OAuth2_test/connect.php') ?>&response_type=code&client_id=<?=GOOGLE_ID ?>">Se connecter via Google</a> j'imagine que ça redirige vers une page Google qui demande de s'authentifier via Google et renvoi vers connect.php une fois fait. le truc c'est que tu peux difficilement te passer de l'authentification dans ce cas là. je pense que Oauth soit pas la solution qu'il te faut, mais je comprend pas ton but final dans cette histoire. qu'est ce que tu cherches à faire exactement? parce que ton explication en orange est incompréhensible. fais un schéma au pire. et saute la partir authentification, explique juste le but principal. Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 20 décembre 2019 Auteur Partager Posté(e) le 20 décembre 2019 non,...ma seul interaction utilisateur pour le moment c'est l'authentification chez google (ou digikey ou autre peut importe) qui n'aura jamais lieu puisque la page d'autenthification se sera pas redirigé vers l'utilisateur (qui de plus n'est pas le propriétaire du compte connecter a l'appli). pour faire simple ce que je veut faire : 1) extraire des données chez les grossiste en electronique 2) mettre ces données (après traitement et formatage) a disposition du public, (dans un site web/une appli/ etc...) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Minikea Posté(e) le 20 décembre 2019 Partager Posté(e) le 20 décembre 2019 ces données ne sont pas dispo si tu n'est pas connecté via Oauth? Est-ce que c'est légal de pomper ces données pour les remettre ensuite au public? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.