Tags :oAuth2, token
19 janvier 2022
publié par 

De nombreuses API REST sont accessibles après une authentification OAuth 2.0. Lorsqu'une application doit réutiliser une connexion sans renouveler systématiquement l'authentification, il est possible de mémoriser le token de connexion obtenu par la fonction AuthIdentifie. Cela peut permettre :

  • à une même application de réutiliser un token qu'elle a obtenu précédemment,
  • d'obtenir un token à partir de l'UI d'une application, et de le réutiliser dans :
    • une autre application dans laquelle on souhaite éviter la phase d'authentification via un navigateur,
    • un service sans interface,
    • un code serveur d'un site web ou d'un webservice...

 

Voici un exemple :

  • créer dans le traitement de connexion une première procédure interne qui sauvegardera le token dans un buffer grâce à une sérialisation :

    PROCEDURE INTERNE SauvegardeToken()
    sNomFichierToken est une chaîne = fRepDonnées()+fSep+"token.bin"
    bufToken est un Buffer
    Sérialise(Token,bufToken,psdBinaire)
    fSauveBuffer(sNomFichierToken,bufToken)
    FIN

  • créer dans le traitement de connexion une seconde procédure interne qui restaurera le token sauvegardé dans un buffer :

    PROCEDURE INTERNE RestaureToken()
    sNomFichierToken est une chaîne=fRepDonnées()+fSep+"token.bin"
    SI fFichierExiste(sNomFichierToken) ALORS
    QUAND EXCEPTION DANS
    Désérialise(Token,fChargeBuffer(sNomFichierToken),psdBinaire)
    FAIRE
    //rien (le token sera invalide)
    FIN
    FIN
    FIN

  • remplacer l'appel unique de AuthIdentifie par un chargement préalable du token obtenu lors de la précédente authentification, afin de l'utiliser :

    RestaureToken()
    SI PAS Token..Valide ALORS
    Token = AuthIdentifie(OAuth2Params)
    SI Token..Valide ALORS
    SauvegardeToken()
    FIN
    SINON
    SI Token.DateExpiration < Maintenant() ALORS
    Token = AuthRenouvelleToken(Token)
    SI Token..Valide ALORS
    SauvegardeToken()
    FIN
    FIN
    FIN
    SI PAS Token..Valide ALORS
    Erreur("Echec de l'authentification ...")
    RETOUR
    FIN

En fonction des besoins le buffer contenant le token peut être chiffré, conservé dans un mémo binaire d'une base HFSQL, un fichier sur disque (cf. fSauveBuffer) ...

 

Liens utiles :

== Mise à jour 17/5/2022 ==

Cas particulier pour une application exécutée sous Android : la sérialisation d'une variable OAuthToken n'est pas encore acceptée. Dans ce cas si on doit mémoriser un token on peut utiliser une variable intermédiraire :

  • créer une classe donc les membres sont strictement identiques aux propriétés du type OAuthToken

    cToken est une Classe
    Actualisation est une chaîne
    DateExpiration est une chaine
    RéponseServeur est une Buffer
    Valeur est une chaîne
    Valide est un booléen
    FIN

  • affecter une instance de cette classe avec la variable OAuthToken obtenue après OAuthIdentifie : la copie homonymique fait le transfert de toutes les données,
  • sérialiser cette instance de classe à la place de la variable OAuthToken.

    SI Token.Valide ALORS
    //sérialise le token
    oCToken est un cToken = Token
    Sérialise(oCToken, bufToken, psdXML)
    FIN

La relecture du token mémorisé sur l'appareil se fera avec l'opération inverse : désérialisation vers une instance de la classe, membres de l'instance ensuite affectés dans la variable OAuthToken :

 

oToken est un cToken
Désérialise(oToken, bufToken, psdXML)
Token.Actualisation = oToken.Actualisation
Token.DateExpiration = oToken.DateExpiration
Token.Valeur = oToken.Valeur



 

< Retour

4 commentaires

Magnien
14/03/2024 - 16:50 - Répondre
Bonjour, je n'arrive pas à effectuer la dernière étape (partie Android). Plus précisément le fait d'affecter l'instance de notre classe cToken à la variable OAuthToken. J'ai une erreur indiquant que les propriétés ..RéponseServeur et ..Valide sont en lecture seulement. Y a-t-il une solution pour cela ? Ai-je mal compris ?

Loic HAMEL
14/03/2024 - 16:58 - Répondre
Je vous engage à faire une requête au Support Technique de PC SOFT.

Stef
20/03/2024 - 16:33 - Répondre
Bonjour, Je rencontre un problème lors du renouvellement d'un token. J'ai bien suivi la démarche de sérialisation d'une instance de classe sous Android, cela fonctionne parfaitement. En revanche, lors de la désérialisation de l'instance de classe j'ai l'erreur suivante au moment de l'affectation de l'instance de la structure à la variable AuthToken : Invalid mapping between 'RéponseServeur' (member) and 'RéponseServeur' (property). The 'RéponseServeur' property is read-only. Ci-dessous le code : OAuth2Params est un OAuth2Paramètres MonToken est un AuthToken sFichierAuth est une chaîne = fRepDonnées() + [fSep] + "token.xml" cToken est une Classe Actualisation est une chaîne DateExpiration est une DateHeure RéponseServeur est une Buffer Valeur est une chaîne Valide est un booléen FIN // -- Demande de Token MonToken = AuthIdentifie(OAuth2Params) // sérialise le token oCToken est un cToken = Token Sérialise(oCToken, bufToken, psdXML) fSauveBuffer(sFichierAuth, bufToken) // désérialisation pour renouvellement SI fFichierExiste(sFichierAuth) ALORS bufToken = fChargeBuffer(sFichierAuth) Désérialise(oCToken, bufToken, psdXML) MonToken = oCToken MonToken = AuthRenouvelleToken(MonToken) FIN Ais-je mal compris la manipulation ?

Loic HAMEL
20/03/2024 - 17:02 - Répondre
Je vous engage à faire une requête au Support Technique de PC SOFT.

Publier un commentaire : 
Votre adresse email ne sera pas publiée