IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Connexion automatique service google


Sujet :

WinDev

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2022
    Messages : 13
    Par défaut Connexion automatique service google
    bonjour à tous,

    Je vous contact suite à un problème que j'ai chez un client lors d'une connexion au service google dans le but de me connecter à l'API Google Sheet.

    Il y a pas mal de temps et suite à la demande d'un client, j'avais déjà fait cette connexion. J'avais eu du mal au niveau de la récupération du token, mais j'a vais finit par passer par une variable OAuth2Paramètres. Le soucis avec cette variable, c'est qu'elle ouvre une fenêtre du navigateur où des paramètres doivent être acceptés (Je vous met 3 screens des autorisations à valider une après l'autre.


    Nom : Capture.PNG
Affichages : 1265
Taille : 19,1 Ko
    ///////////////////////////////////////////////////////////////////////////////////////////
    Nom : Capture2.PNG
Affichages : 1227
Taille : 17,7 Ko
    //////////////////////////////////////////////////////////////////////////////////////////
    Nom : Capture3.PNG
Affichages : 1216
Taille : 62,9 Ko

    C'était ok pour le premier client, car les modifications se faisaient une seule fois par jour, donc ca ne le dérangeait pas. Pour le nouveau, c'est un peu plus complexe car la connexion doit se faire à chaque modif.

    Autant vous dire qu'il est hors de question qu'il doive faire la même manipulation 150 fois dans la journée.


    Donc je me demandais si certains d'entre vous avaient une solution pour récupérer le token sans que cette fenêtre s'ouvre.


    Edit: Mon code de lecture d'un document googleSheet, au cas où:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    OAuth2Params.ClientID = "MonClientID"
    OAuth2Params.ClientSecret ="MonClientSecret"
    OAuth2Params.URLAuth = "https://accounts.google.com/o/oauth2/auth"
    OAuth2Params.URLToken="https://accounts.google.com/o/oauth2/token"
    OAuth2Params.Scope="https://www.googleapis.com/auth/spreadsheets"
     
    MonToken est un AuthToken = AuthIdentifie(OAuth2Params)
     
    req est un httpRequête
    req.Méthode = httpGet
    req.URL = "https://sheets.googleapis.com/v4/spreadsheets/IDSheet/values/Feuil1!A1:E5"
    req.AuthToken = MonToken // Token d'authentification
    req.ContentType = "application/json"
    vParamAPI est un Variant
    req.Contenu = VariantVersJSON(vParamAPI)
     
    réponseHTTP est un httpRéponse = HTTPEnvoie(req)
    soit Données = JSONVersVariant(réponseHTTP.Contenu)

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 392
    Par défaut
    Bonjour,

    Tu devrais trouver ces informations intéressantes :
    https://blogs.pcsoft.fr/fr/conserver...11024/read.awp

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2022
    Messages : 13
    Par défaut
    Merci, cela répond effectivement à plusieurs de mes questions.

    Malheureusement, je n'ai pas précisé que j'étais en Windev 24, et la fonction AuthRenouvelleToken n'est apparue qu'en Windev 26. Le moyen que j'ai pour rafraichir le token n'est alors plus bon...

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 392
    Par défaut
    J'avais ce bout de code là fût un temps que j'ai dû avoir sur developpez.com :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    SELON fFichierExiste(CompteGmail.Token.Dossier + procFichierGMail()) 
    	CAS Faux // Si les tokens ne sont pas trouver alors ont les récupère et ont les sauvegarde dans un fichier
    		// On va utiliser une fenêtre HTML plutôt que d'ouvrir un navigateur
     
    		buf est un Buffer = Ouvre(FEN_HTML, procURIGMail())
    		SI buf = "" ALORS
    			procMessageBoxErreur("Impossible d'autoriser le logiciel à utiliser GMail.", procCouleurGeneral())
    			RENVOYER Faux
    		FIN
     
     
    		Variant = JSONVersVariant(buf)
    		sError est chaîne = Variant.error_description
    		SI sError <> "0" ALORS
    			procMessageBoxErreur(sError, procCouleurGeneral())
    			RENVOYER Faux
    		FIN
     
    		CompteGmail.Token.Acces 					= 	Variant.access_token
    		CompteGmail.Token.Refresh 					= 	Variant.refresh_token
    		CompteGmail.Token.LimiteValidité 			= 	DateHeureSys()
    		CompteGmail.Token.LimiteValidité..Minute	+=	55 // Accès Token valide 60 minutes mais par sécurité, le rendre valide uniquement 55 minutes.
    		Variant.DateHeureLimite 					= 	CompteGmail.Token.LimiteValidité
    		fSauveTexte(CompteGmail.Token.Dossier + procFichierGMail(), VariantVersJSON(Variant))
     
    	CAS Vrai // Si les tokens sont trouver alors ont vérifie la validité de l'Acces Token
    		Variant 									= 	JSONVersVariant(fChargeTexte(CompteGmail.Token.Dossier + procFichierGMail()))
    		CompteGmail.Token.Acces						=	Variant.access_token
    		CompteGmail.Token.Refresh					=	Variant.refresh_token
    		CompteGmail.Token.LimiteValidité			=	Variant.DateHeureLimite
    		SI DateHeureSys() > CompteGmail.Token.LimiteValidité // Si la DateHeureSys est supérieure a la date limite de validité de l'Acces Token alors il faut en récupérer un nouveau
    			REQ_AccesToken est une httpRequête
    			REQ_AccesToken.URL	 							= 	CompteGmail.OAuth..URLToken + ["?"]
    			REQ_AccesToken.Contenu 							= 	URLEncode(ChaîneVersUTF8(ChaîneConstruit("client_id=%1&client_secret=%2&refresh_token=%3&grant_type=refresh_token",...
    																	CompteGmail.OAuth.ClientID, CompteGmail.OAuth.ClientSecret, CompteGmail.Token.Refresh)))
    			REP_AccesToken est une httpRéponse 				= 	HTTPEnvoie(REQ_AccesToken)
    			SI ErreurDétectée = Vrai ALORS
    				Erreur(ErreurInfo(errMessage))
    			SINON
    				Variant 									= 	JSONVersVariant(REP_AccesToken.Contenu)
    				Variant.refresh_token						= 	CompteGmail.Token.Refresh
    				CompteGmail.Token.Acces 					= 	Variant.access_token
    				CompteGmail.Token.LimiteValidité 			= 	DateHeureSys()
    				CompteGmail.Token.LimiteValidité..Minute	+=	55 // Acces Token valide 60 minutes mais par sécurité, le rendre valide uniquement 55 minutes.
    				fSauveTexte(CompteGmail.Token.Dossier + procFichierGMail(), VariantVersJSON(Variant))
    			FIN
    		FIN
    FIN

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2022
    Messages : 13
    Par défaut
    J'ai trouvé exactement le même bout de code que j'ai remanié. Merci beaucoup!


    Si jamais cela peu aider, je met les deux bouts qui m'ont permi de régler le soucis

    Code de ma fenêtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    PROCÉDURE MaFenêtre()
     
    STToken est une Structure
    	Acces 				est une chaîne
    	Refresh 			est une chaîne
    	LimiteValidité 		est un 	DateHeure
    	Dossier				est une chaîne
    FIN
    STAuthtok est une Structure
    	AdresseMail 		est une chaîne
    	OAuth 				est un OAuth2Paramètres
    	Token  				est un STToken
    FIN
    CompteSheet est un STAuthtok
     
     
    //CompteSheet.AdresseMail = "windevtestapi@gmail.com"
     
    AVEC CompteSheet.OAuth
    	..ClientID 		= "MonClientID"
    	..ClientSecret 	= "MonClientSecret"
    	..URLAuth 		= "https://accounts.google.com/o/oauth2/auth"
    	..URLToken 		= "https://accounts.google.com/o/oauth2/token"
    	..Scope			= "https://www.googleapis.com/auth/spreadsheets"
    FIN
     
    CompteSheet.Token.Dossier	=	SysRep(srAppDataLocal) + [fSep]

    Code de ma procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    PROCÉDURE RécupérationToken()
     
     
    //Gestion des Tokens
     
    Variant est un Variant
    SELON fFichierExiste(CompteSheet.Token.Dossier + "APISheet.json") 
    	CAS Faux : // Si les tokens ne sont pas trouver alors ont les récupère et ont les sauvegarde dans un fichier
    		// Demande d'authentification : ouvre la fenêtre de login
    		MonToken est un AuthToken = AuthIdentifie(CompteSheet.OAuth)
    		SELON MonToken.Valide
    			CAS Faux : Erreur("Impossible de récupérer les Tokens.")	
    			CAS Vrai :
    				Variant 			 						= 	JSONVersVariant(MonToken..RéponseServeur)
    				CompteSheet.Token.Acces 					= 	Variant.access_token
    				CompteSheet.Token.Refresh 					= 	Variant.refresh_token
    				CompteSheet.Token.LimiteValidité 			= 	DateHeureSys()
    				CompteSheet.Token.LimiteValidité..Minute	+=	55 // Acces Token valide 60 minutes mais par sécurité, le rendre valide uniquement 55 minutes.
    				Variant.DateHeureLimite 					= 	CompteSheet.Token.LimiteValidité
    				fSauveTexte(CompteSheet.Token.Dossier + "APISheet.json",VariantVersJSON(Variant))
    		FIN
    	CAS Vrai : // Si les tokens sont trouver alors ont vérifie la validité de l'Acces Token
    		Variant 									= 	JSONVersVariant(fChargeTexte(CompteSheet.Token.Dossier + "APISheet.json"))
    		CompteSheet.Token.Acces						=	Variant.access_token
    		CompteSheet.Token.Refresh					=	Variant.refresh_token
    		CompteSheet.Token.LimiteValidité			=	Variant.DateHeureLimite
    		SI DateHeureSys() > CompteSheet.Token.LimiteValidité // Si la DateHeureSys est supérieure a la date limite de validité de l'Acces Token alors il faut en récupérer un nouveau
    			REQ_AccesToken est une httpRequête
    			REQ_AccesToken.URL	 							= 	CompteSheet.OAuth..URLToken + ["?"]
    			REQ_AccesToken.Contenu 							= 	URLEncode(ChaîneVersUTF8(ChaîneConstruit("client_id=%1&client_secret=%2&refresh_token=%3&grant_type=refresh_token",CompteSheet.OAuth.ClientID,CompteSheet.OAuth.ClientSecret,CompteSheet.Token.Refresh)))
    			REP_AccesToken est une httpRéponse 				= 	HTTPEnvoie(REQ_AccesToken)
    			SI ErreurDétectée = Vrai ALORS
    				Erreur(ErreurInfo(errMessage))
    			SINON
    				Variant 									= 	JSONVersVariant(REP_AccesToken.Contenu)
    				Variant.refresh_token						= 	CompteSheet.Token.Refresh
    				CompteSheet.Token.Acces 					= 	Variant.access_token
    				CompteSheet.Token.LimiteValidité 			= 	DateHeureSys()
    				CompteSheet.Token.LimiteValidité..Minute	+=	55 // Acces Token valide 60 minutes mais par sécurité, le rendre valide uniquement 55 minutes.
    				Variant.DateHeureLimite 					= 	CompteSheet.Token.LimiteValidité
    				fSauveTexte(CompteSheet.Token.Dossier + "APISheet.json",VariantVersJSON(Variant))
    			FIN
    		FIN
    FIN

    En gros, une première connexion est faite via navigateur. Cela créé un Json avec les informations dont nous avons besoin (access_token, refresh_token...).
    L'access Token va servir à se connecter au service API (GoogleSheet pour moi), et le refresh Token va être utilisé pour rafraichir l'access Token lorsque celui-ci ne sera plus valide (1h).
    Si la date/heure enregistrée dans votre Json est supérieure à la date système, on fait donc une requête pour rafraichir le token, ce qui permettra de ne plus passer par la connexion faite par navigateur.

    La seule chose en plus ajoutée par rapport au code de Lo², c'est une ligne qui permet de mettre la date et l'heure lorsque le Token est refresh. Surement un ounlie de la part de la personne ayant donnée la solution.

Discussions similaires

  1. [WD23] Connexion aux service Google
    Par wd_newbie dans le forum WinDev
    Réponses: 6
    Dernier message: 11/11/2022, 23h18
  2. [Web Service] Google Plus Récupération d'informations et connexion automatique
    Par Kevin0363 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 05/11/2013, 14h38
  3. Connexion automatique à Google doc
    Par Mathieu Salles dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 16/01/2013, 11h28
  4. [CR9][SQL Server] Connexion automatique
    Par PetitScarabe dans le forum Connectivité
    Réponses: 6
    Dernier message: 31/03/2005, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo