PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV (versiones precedentes) → Recupérer un token OAuth2 sans ouverture de fenetre de login en Windev27
Recupérer un token OAuth2 sans ouverture de fenetre de login en Windev27
Iniciado por Emmanuel Vitrac, 17,nov. 2025 04:09 - 4 respuestas
Publicado el 17,noviembre 2025 - 04:09
Bonjour, c'est ma première tentative pour me connecter à une API REST et récupérer des données.

Je teste pour commencer les différents moyens de récupérer un token en OAuth2.

J'ai essayé avec AuthIdentifie et j'ai réussi a obtenir un token mais je me rend compte qu'on ne peut pas éviter l'ouverture d'une page web en WD27. (test 1)

J'essaie donc avec HTTPENVOIE mais j'ai soi une erreur 400 (test2) soit un token vide (test3)

Si une bonne âme pouvait me donner une piste, je ne m'attendais pas à tant de difficulté...

Emmanuel

TEST 1 :
//******************AVEC AUTHIDENTIFIE : fenetre de login obligatoire en Windev27, Token OK mais la requete finales ne renvoie rien
cMaRequete est un restRequête
cMaRequete.URL = "https://shdemo.xpertis.nc/basicdata-api/api/v1/companies"

//HTTPConfigure(httpModeSansFenêtre, True)

OAuth2Params est un OAuth2Paramètres
OAuth2Params.ClientID = "srvacc-api"
OAuth2Params.ClientSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"
OAuth2Params.URLAuth = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/auth"
OAuth2Params.URLToken = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"
OAuth2Params.ParamètresSupplémentaires = "force_reapprove=false"
OAuth2Params.URLRedirection = "http://localhost:9874/"
OAuth2Params.ParamètresSupplémentaires="force_reapprove=false"
//Demande d'authentification : ouvre la fenêtre de login

MonToken est un AuthToken = AuthIdentifie(OAuth2Params)

SI PAS MonToken.Valide ALORS
Erreur("pb de connexion API "+CR+ErreurInfo(errComplet))
SINON
cMaRequete.AuthToken = MonToken
// cMaRequete.Utilisateur="admin-sirh@asys.fr"
// cMaRequete.MotDePasse="Asys%2023!"
cMaReponse est un httpRéponse = RESTEnvoie(cMaRequete)
SI ErreurDétectée ALORS
Erreur("Pb de requête API : "+CR+ErreurInfo(errComplet))
SINON
Info("Résultat code : "+cMaReponse.CodeEtat+CR+"Data : "+cMaReponse.Contenu+CR+"Token : "+MonToken.Valeur)
FIN
FIN


//****************** TEST2 avec HTTPENVOIE : erreur 400
httpToken_Requete est une httpRequête
httpToken_Réponse est une httpRéponse

sCléClient est une chaîne
sCléSecret est une chaîne
sUtilisateur est une chaîne
sMotPasse est une chaîne

sUtilisateur = "admin-sirh@asys.fr"
sMotPasse = "Asys%2023!"
sCléClient = "srvacc-api"
sCléSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"

httpToken_Requete..Méthode = httpPost
httpToken_Requete..URL = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

// Construction du contenu de la requête POST avec la chaîne standard
// qui concatène toutes les données d'authentification
httpToken_Requete..Contenu = "grant_type=password&username="+sUtilisateur+"&password="+sMotPasse+"&client_id="+sCléClient+"&client_secret="+sCléSecret
httpToken_Réponse = HTTPEnvoie(httpToken_Requete)
// On doit vérifier que httpToken_Réponse..CodeEtat = 200 et traiter les erreurs
SI httpToken_Réponse..CodeEtat=200
jToken est un JSON = httpToken_Réponse..Contenu
Info(httpToken_Réponse..Contenu)
SINON
Erreur("Pb de requête API : code erreur = "+httpToken_Réponse..CodeEtat)
FIN


//****************** TEST3 avec HTTPENVOIE : token vide
sURLToken est une chaîne = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

reqToken est un httpRequest
reqToken.URL = sURLToken
reqToken.Méthode = httpPost
reqToken.ContentType = "application/x-www-form-urlencoded"

// Corps du POST OAuth2
reqToken.Contenu = [
grant_type=client_credentials&
client_id=srvacc-API&
client_secret=VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx&
scope=API.read
]

// Exécuter silencieusement
HTTPEnvoie(reqToken)
SI PAS ErreurDétectée
sJSON est une chaîne = HTTPDonneRésultat()
rep est un Variant = JSONVersVariant(sJSON)
token est une chaîne = rep.access_token
Info(token)
SINON
Erreur("Erreur OAuth2 : " + ErreurInfo(errComplet))
RETOUR
FIN
Publicado el 18,noviembre 2025 - 07:48
C'est bon , merci l'IA !!!
Publicado el 25,noviembre 2025 - 15:27
Emmanuel Vitrac a écrit :
> C'est bon , merci l'IA !!!

Comment as-tu résolu le problème ?
Publicado el 27,noviembre 2025 - 10:41
Emmanuel Vitrac escribío:
Bonjour, c'est ma première tentative pour me connecter à une API REST et récupérer des données.

Je teste pour commencer les différents moyens de récupérer un token en OAuth2. https://www.ez-passoh.com

J'ai essayé avec AuthIdentifie et j'ai réussi a obtenir un token mais je me rend compte qu'on ne peut pas éviter l'ouverture d'une page web en WD27. (test 1)

J'essaie donc avec HTTPENVOIE mais j'ai soi une erreur 400 (test2) soit un token vide (test3)

Si une bonne âme pouvait me donner une piste, je ne m'attendais pas à tant de difficulté...

Emmanuel

TEST 1 :
//******************AVEC AUTHIDENTIFIE : fenetre de login obligatoire en Windev27, Token OK mais la requete finales ne renvoie rien
cMaRequete est un restRequête
cMaRequete.URL = "https://shdemo.xpertis.nc/basicdata-api/api/v1/companies"

//HTTPConfigure(httpModeSansFenêtre, True)

OAuth2Params est un OAuth2Paramètres
OAuth2Params.ClientID = "srvacc-api"
OAuth2Params.ClientSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"
OAuth2Params.URLAuth = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/auth"
OAuth2Params.URLToken = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"
OAuth2Params.ParamètresSupplémentaires = "force_reapprove=false"
OAuth2Params.URLRedirection = "http://localhost:9874/"
OAuth2Params.ParamètresSupplémentaires="force_reapprove=false"
//Demande d'authentification : ouvre la fenêtre de login

MonToken est un AuthToken = AuthIdentifie(OAuth2Params)

SI PAS MonToken.Valide ALORS
Erreur("pb de connexion API "+CR+ErreurInfo(errComplet))
SINON
cMaRequete.AuthToken = MonToken
// cMaRequete.Utilisateur="admin-sirh@asys.fr"
// cMaRequete.MotDePasse="Asys%2023!"
cMaReponse est un httpRéponse = RESTEnvoie(cMaRequete)
SI ErreurDétectée ALORS
Erreur("Pb de requête API : "+CR+ErreurInfo(errComplet))
SINON
Info("Résultat code : "+cMaReponse.CodeEtat+CR+"Data : "+cMaReponse.Contenu+CR+"Token : "+MonToken.Valeur)
FIN
FIN


//****************** TEST2 avec HTTPENVOIE : erreur 400
httpToken_Requete est une httpRequête
httpToken_Réponse est une httpRéponse

sCléClient est une chaîne
sCléSecret est une chaîne
sUtilisateur est une chaîne
sMotPasse est une chaîne

sUtilisateur = "admin-sirh@asys.fr"
sMotPasse = "Asys%2023!"
sCléClient = "srvacc-api"
sCléSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"

httpToken_Requete..Méthode = httpPost
httpToken_Requete..URL = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

// Construction du contenu de la requête POST avec la chaîne standard
// qui concatène toutes les données d'authentification
httpToken_Requete..Contenu = "grant_type=password&username="+sUtilisateur+"&password="+sMotPasse+"&client_id="+sCléClient+"&client_secret="+sCléSecret
httpToken_Réponse = HTTPEnvoie(httpToken_Requete)
// On doit vérifier que httpToken_Réponse..CodeEtat = 200 et traiter les erreurs
SI httpToken_Réponse..CodeEtat=200
jToken est un JSON = httpToken_Réponse..Contenu
Info(httpToken_Réponse..Contenu)
SINON
Erreur("Pb de requête API : code erreur = "+httpToken_Réponse..CodeEtat)
FIN


//****************** TEST3 avec HTTPENVOIE : token vide
sURLToken est une chaîne = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

reqToken est un httpRequest
reqToken.URL = sURLToken
reqToken.Méthode = httpPost
reqToken.ContentType = "application/x-www-form-urlencoded"

// Corps du POST OAuth2
reqToken.Contenu = [
grant_type=client_credentials&
client_id=srvacc-API&
client_secret=VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx&
scope=API.read
]

// Exécuter silencieusement
HTTPEnvoie(reqToken)
SI PAS ErreurDétectée
sJSON est une chaîne = HTTPDonneRésultat()
rep est un Variant = JSONVersVariant(sJSON)
token est une chaîne = rep.access_token
Info(token)
SINON
Erreur("Erreur OAuth2 : " + ErreurInfo(errComplet))
RETOUR
FIN


C'est une excellente initiative de vous lancer dans l'accès aux API REST, et l'OAuth2 est souvent l'étape la plus délicate au début. Vos tests montrent que vous êtes très proche de la solution !

La difficulté que vous rencontrez provient principalement du type d'octroi (grant type) que vous essayez d'utiliser et de la configuration de l'API.

Voici une analyse de vos tests et les pistes pour réussir à obtenir un jeton sans fenêtre de navigateur (ce que l'on appelle généralement un service to service
Publicado el 27,noviembre 2025 - 10:41
Emmanuel Vitrac escribío:
Bonjour, c'est ma première tentative pour me connecter à une API REST et récupérer des données.

Je teste pour commencer les différents moyens de récupérer un token en OAuth2. https://www.ez-passoh.com

J'ai essayé avec AuthIdentifie et j'ai réussi a obtenir un token mais je me rend compte qu'on ne peut pas éviter l'ouverture d'une page web en WD27. (test 1)

J'essaie donc avec HTTPENVOIE mais j'ai soi une erreur 400 (test2) soit un token vide (test3)

Si une bonne âme pouvait me donner une piste, je ne m'attendais pas à tant de difficulté...

Emmanuel

TEST 1 :
//******************AVEC AUTHIDENTIFIE : fenetre de login obligatoire en Windev27, Token OK mais la requete finales ne renvoie rien
cMaRequete est un restRequête
cMaRequete.URL = "https://shdemo.xpertis.nc/basicdata-api/api/v1/companies"

//HTTPConfigure(httpModeSansFenêtre, True)

OAuth2Params est un OAuth2Paramètres
OAuth2Params.ClientID = "srvacc-api"
OAuth2Params.ClientSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"
OAuth2Params.URLAuth = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/auth"
OAuth2Params.URLToken = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"
OAuth2Params.ParamètresSupplémentaires = "force_reapprove=false"
OAuth2Params.URLRedirection = "http://localhost:9874/"
OAuth2Params.ParamètresSupplémentaires="force_reapprove=false"
//Demande d'authentification : ouvre la fenêtre de login

MonToken est un AuthToken = AuthIdentifie(OAuth2Params)

SI PAS MonToken.Valide ALORS
Erreur("pb de connexion API "+CR+ErreurInfo(errComplet))
SINON
cMaRequete.AuthToken = MonToken
// cMaRequete.Utilisateur="admin-sirh@asys.fr"
// cMaRequete.MotDePasse="Asys%2023!"
cMaReponse est un httpRéponse = RESTEnvoie(cMaRequete)
SI ErreurDétectée ALORS
Erreur("Pb de requête API : "+CR+ErreurInfo(errComplet))
SINON
Info("Résultat code : "+cMaReponse.CodeEtat+CR+"Data : "+cMaReponse.Contenu+CR+"Token : "+MonToken.Valeur)
FIN
FIN


//****************** TEST2 avec HTTPENVOIE : erreur 400
httpToken_Requete est une httpRequête
httpToken_Réponse est une httpRéponse

sCléClient est une chaîne
sCléSecret est une chaîne
sUtilisateur est une chaîne
sMotPasse est une chaîne

sUtilisateur = "admin-sirh@asys.fr"
sMotPasse = "Asys%2023!"
sCléClient = "srvacc-api"
sCléSecret = "VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx"

httpToken_Requete..Méthode = httpPost
httpToken_Requete..URL = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

// Construction du contenu de la requête POST avec la chaîne standard
// qui concatène toutes les données d'authentification
httpToken_Requete..Contenu = "grant_type=password&username="+sUtilisateur+"&password="+sMotPasse+"&client_id="+sCléClient+"&client_secret="+sCléSecret
httpToken_Réponse = HTTPEnvoie(httpToken_Requete)
// On doit vérifier que httpToken_Réponse..CodeEtat = 200 et traiter les erreurs
SI httpToken_Réponse..CodeEtat=200
jToken est un JSON = httpToken_Réponse..Contenu
Info(httpToken_Réponse..Contenu)
SINON
Erreur("Pb de requête API : code erreur = "+httpToken_Réponse..CodeEtat)
FIN


//****************** TEST3 avec HTTPENVOIE : token vide
sURLToken est une chaîne = "https://keycloak.xpertis.nc/auth/realms/DEMO/protocol/openid-connect/token"

reqToken est un httpRequest
reqToken.URL = sURLToken
reqToken.Méthode = httpPost
reqToken.ContentType = "application/x-www-form-urlencoded"

// Corps du POST OAuth2
reqToken.Contenu = [
grant_type=client_credentials&
client_id=srvacc-API&
client_secret=VvLMkK9zyngaXvJQ0TZraR2EQqxFIWTx&
scope=API.read
]

// Exécuter silencieusement
HTTPEnvoie(reqToken)
SI PAS ErreurDétectée
sJSON est une chaîne = HTTPDonneRésultat()
rep est un Variant = JSONVersVariant(sJSON)
token est une chaîne = rep.access_token
Info(token)
SINON
Erreur("Erreur OAuth2 : " + ErreurInfo(errComplet))
RETOUR
FIN


C'est une excellente initiative de vous lancer dans l'accès aux API REST, et l'OAuth2 est souvent l'étape la plus délicate au début. Vos tests montrent que vous êtes très proche de la solution !

La difficulté que vous rencontrez provient principalement du type d'octroi (grant type) que vous essayez d'utiliser et de la configuration de l'API.

Voici une analyse de vos tests et les pistes pour réussir à obtenir un jeton sans fenêtre de navigateur (ce que l'on appelle généralement un service to service