Jump to content
Sign in to follow this  
GROS_FAIGNAN

procedure d'identification

Recommended Posts

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.

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ?

 

Share this post


Link to post
Share on other sites

[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 ?

Share this post


Link to post
Share on other sites

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 :

  1. enregistrement et recuperation des identifiant (CLIENT_ID & CLIENT_SECRET) sur les services de googlesapi.com
  2. creation de mes debut de pages php (elle sont ok)
  3. lorsque je clique sur mon bouton se connecter avec google sur ma page php j'ai bien la page google qui s'affiche
  4. 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;

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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>

 

 

 

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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)

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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

 

 

 

Share this post


Link to post
Share on other sites

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

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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.

  • Thanks 1

Share this post


Link to post
Share on other sites

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 ?

 

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites
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

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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.

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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...)

Edited by GROS_FAIGNAN

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×
×
  • Create New...