PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Code CURL en Windev pour accès oauth2 à une application API publique
Code CURL en Windev pour accès oauth2 à une application API publique
Iniciado por OR, out., 04 2022 12:39 PM - 5 respostas
Membro registado
8 mensagems
Publicado em outubro, 04 2022 - 12:39 PM
Bonjour Forum,

Je travaille actuellement sur un raccordement à une application qui utilise le site https://api.dgfip.finances.gouv.fr
Pour me raccorder à une application il faut que je passe par un protocole oauth2.

Malheureusement, je n'arrive pas à trouver la solution malgré tout le temps passé à lire la documentation de l'API et à tester différentes possibilités.

Le site propose deux instructions CURL :
curl -k -X POST https://IP-GATEWAY-AB/token -d "grant_type=password&username=Username&password=Password"
-H "Authorization: Basic Base64(consumer-key:consumer-secret)"

curl -k -X POST https://IP-GATEWAY-AB/token -d "grant_type=client_credentials"
-H "Authorization: Basic Base64(consumer-key:consumer-secret)"

Nous avons essayé la même stratégie que sur le site Piste de Chorus Pro déjà largement commenté sur le forum mais sans succès :

MaHttp est une httpRequête
cMaReponse est une httpRéponse
MaHttp.Méthode = httpPost
MaHttp.User = gsinfClientid
MaHttp.Password = gsinfclientsecret
MaHttp.Entête["Content-Type"] = "application/x-www-form-urlencoded"
MaHttp.URL = "https://IP-GATEWAY-AB/token"
MaHttp.Contenu = ChaîneVersUTF8(ChaîneConstruit("grant_type=client_credentials&gsinclient_id=%1&gsinfclient_secret=%2",gsinfClientid,gsinfclientsecret)))
cMaReponse = HTTPEnvoie(MaHttp)
v est un Variant = JSONVersVariant(cMaReponse.Contenu)
gstoken = v.access_token
Valeur est une chaîne
SI ErreurDétectée ALORS
Trace("Erreur" + RC + ErreurInfo(errComplet))
Info("Erreur" + RC + ErreurInfo(errComplet))
RETOUR
SINON
Valeur=(cMaReponse..Contenu)
FIN


Comme nous avons vu que la clef id + secret était demandée en Base 64 nous avons essayé une autre approche pour envoyer directement la clef encodée.

MaHttp est une httpRequête
cMaReponse est une httpRéponse
Data est une Structure
grant_type est une chaîne
Authorization est une chaîne
FIN

sDataJSON est une chaîne
stDataStructure est un Data
sAuth_base64 est une chaîne
sEnteteAuthentification est une chaîne ANSI =ChaîneVersUTF8(ChaîneConstruit(gsinfClientid+":"+gsinfclientsecret))
sAuth_base64=Encode(sEnteteAuthentification,encodeBASE64SansRC)
stDataStructure:grant_type="client_credentials"
stDataStructure:Authorization=sAuth_base64
Sérialise(stDataStructure, sDataJSON, psdJSON)
MaHttp.Méthode = httpPost
MaHttp.Entête["Content-Type"] = "application/x-www-form-urlencoded"
MaHttp.URL = "https://IP-GATEWAY-AB/token"
MaHttp.Contenu = sDataJSON
cMaReponse = HTTPEnvoie(MaHttp)
SI ErreurDétectée ALORS
Trace("Erreur" + RC + ErreurInfo(errComplet))
SINON
Trace(cMaReponse..Contenu)
FIN

Voici ce que je transmets
{ "grant_type":"client_credentials", "Authorization":"wtXV4eXBIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzVwdVFuVU04VXzy" }


Ce qui nous restitue Windev en anomalie.

Erreur<\r><\n>Appel WL :<\r><\n>Traitement de 'Clic sur BTN_SansNom1' (FEN_MENU.BTN_SansNom1), ligne 24<\r><\n>Fonction 'HTTPEnvoie', syntaxe 0<\r><\n><\r><\n>Que s'est-il passé ?<\r><\n>Le serveur HTTP ne répond pas. Vérifiez l'adresse et l'accessibilité au serveur.<\r><\n><\r><\n>Code erreur : 100072<\r><\n>Niveau : erreur non fatale<\r><\n><\r><\n>Message d'erreur système :<\r><\n>Impossible de résoudre le nom de l'hôte.<\r><\n>Module : wd270com64.dll (01F270103n - 27.0.362.0)<\r><\n><\r><\n>Informations de débogage :<\r><\n>Fonction (10,420)<\r><\n>Informations supplémentaires :<\r><\n>EIT_PILEWL :<\r><\n>Clic sur BTN_SansNom1 (FEN_MENU.BTN_SansNom1), ligne 24<\r><\n>EIT_DATEHEURE : 04/10/2022 12:08:21<\r><\n>EIT_TYPE_WDFILE : <2><\r><\n>EIT_IDCODE : <18>

Si vous avez une solution, elle sera la bienvenue.

Merci d'avance pour votre aide.

Olivier
Membro registado
57 mensagems
Popularité : +9 (11 votes)
Publicado em outubro, 04 2022 - 5:41 PM
Bonjour,

La réponse "Impossible de résoudre le nom de l'hôte" est sans appel, c'est "juste" l'adresse IP ou le nom de serveur donné dans l'url qui ne permet pas d'atteindre le serveur.

Dans votre code c'est à ce niveau :
MaHttp.URL = "https:// ICI IL FAUT DOMAINE ou IP VALIDE /token"

Si le nom ou m'adresse donnée est valide, il peut s'agir d'un barrière de sécurité de vos installations réseau (antivirus trop agressif qui bloque les accès aux programmes qui ne sont pas explicitement autorisés...)

Au passage, l'ajout de MaHttp..ProcédureTrace permet de voir les échanges avec le serveur (une fois qu'il sera joignable), ça facilite ce genre de mise au point.

--
A+
Dev-OC
Membro registado
8 mensagems
Publicado em outubro, 04 2022 - 6:08 PM
Désolé ....https://IP-GATEWAY-ZA/token

Merci du retour.

Si vous avez une idée çà serait super.

Olivier
Membro registado
8 mensagems
Publicado em outubro, 05 2022 - 5:44 PM
Voici la solution à notre question pour avoir un token Infinoe qui s'appuie sur le site https://api.dgfip.finances.gouv.fr

Cà pourra servir utilement à la communauté.

sAuth_base64 est une chaîne
sEnteteAuthentification est une chaîne ANSI = ChaîneVersUTF8(ChaîneConstruit(gsinfClientid+":"+gsinfclientsecret))
sAuth_base64 = Encode(sEnteteAuthentification,encodeBASE64SansRC)
Authorization est une chaîne
Authorization=sAuth_base64

MaHttp est une httpRequête
cMaReponse est un httpRéponse
MaHttp.Méthode = httpPost
MaHttp.Entête["Content-Type"] = "application/x-www-form-urlencoded"
MaHttp.Entête["Authorization"] = Authorization
MaHttp.User=gsinfClientid
MaHttp.Password=gsinfclientsecret

SI gninfServeur=1 ALORS
MaHttp.URL = gsinfURLtest
SINON SI gninfServeur=2 ALORS
MaHttp.URL = gsinfURLprod
SINON SI gninfServeur=0 ALORS
Info("Il n'y a pas de serveur actif)")
RETOUR
FIN
Info(gsinfURLtest)
MaHttp.Contenu = ChaîneVersUTF8(ChaîneConstruit("grant_type=client_credentials&client_id=%1&client_secret=%2&authorization=%3&scope=openid",gsinfClientid,gsinfclientsecret,Authorization))
Trace(MaHttp.Contenu)
Info(MaHttp.Contenu)
cMaReponse = HTTPEnvoie(MaHttp)
v est un Variant = JSONVersVariant(cMaReponse.Contenu)
// Stocke le token
gstoken = v.access_token
Valeur est une chaîne
SI ErreurDétectée ALORS
Trace("Erreur" + RC + ErreurInfo(errComplet))
Info("Erreur" + RC + ErreurInfo(errComplet))
RETOUR
SINON
Trace(cMaReponse..Contenu)
Valeur=(cMaReponse..Contenu)
Info(Valeur)
FIN
Membro registado
187 mensagems
Publicado em outubro, 06 2022 - 6:44 AM
Bonjour et merci beaucoup

--
Cordialement

Jean-Claude FLAJOULOT
Membro registado
119 mensagems
Publicado em outubro, 06 2022 - 8:14 AM
Merci pour votre contribution. Beau boulot