Authentification OAuth2 dans formulaire CVT multi-étapes

Bonjour à tous,

J’avais produit un plugin il y a deux ans permettant de récupérer les données pluviométrique de stations météo connectées.
J’ai donc un plugin principal qui se charge de créer l’objet Station, les tables, la base du formulaire d’ajout de Station… et des plugins / modules pour chaque type de station qui modifient les tables avec insertion de nouveaux champs, ajout d’étapes aux formulaires d’ajout de station…

Tout cela fonctionne pas trop mal depuis deux ans mais pour l’un des modules, j’aurais besoin de revoir le mécanisme d’authentification pour basculer vers un mécanisme OAuth2.

Du coup actuellement, j’ai le fonctionnement suivant :

  1. Créer une station m’amène à un formulaire où je dois saisir un nom et sélectionner le type de station ;
  2. le type de station détermine le contenu de l’étape 2 du formulaire. Pour le module concerné, je récupère les informations de connexion ;
  3. j’authentifie l’utilisateur et en fonction de la réponse de l’API je lui propose de choisir parmi les stations associées à son compte.
  4. Validation et création de la station

Si je dois utiliser OAuth2, je me retrouve un peu perdu au niveau de l’étape 3 : il me faudrait à la validation de l’étape ouvrir une nouvelle page permettant d’autoriser ou non l’application puis de renvoyer vers le formulaire via une URL de retour. Mais j’ai le sentiment que cela implique :

  • de surcharger le comportement du bouton ? Cela est-il possible via Saisies ?
  • d’avoir temporairement sauvegardé le contenu des premières étapes du formulaire ? Quel serait le moyen le plus approprié ?

Ou faut-il penser autrement la création d’une station ?

En vous remerciant par avance pour vos retours !

hello,
tu ne peux pas faire d’oauth2 dans un formulaire cvt multi etapes, car en effet l’oauth2 suppose d’envoyer l’utilisateur sur le site d’identification, qui le renvoie chez toi avec un jeton (sur une action spip par exemple). Donc tu casse forcément le cvt multi-etapes.

Dans ce cas il faut que tu prévoies de pouvoir faire la dernière étape 4 dans un formulaire séparé sur lequel tu renvoies après authentification oauth

Ok, merci beaucoup pour ce rapide retour !

Mais du coup, je peux avoir deux formulaires différents pour éditer un même objet ? Ou dans ma fonction netatmo_formulaire_saisies, j’ajoute une condition qui teste l’existence du jeton avec request('clé') ? et en fonction de si j’ai ou non ce paramètre j’affiche ou non tels champs ?

J’ai peur de faire fausse route :-/

Mais peut-être qu’il faut pas commencer à créer l’objet tant que t’as pas demander le type de station et s’y être connecté : 1) on choisit le type du nouveau truc qu’on veut créer dans un form A, 2) on s’y connecte, 3) dans un form B là on crée la nouvelle station côté SPIP en entier


RastaPopoulos

Merci beaucoup mais je coince encore même si j’y vois beaucoup plus clair :

  • dans mon premier formulaire, je choisis le type et je renseigne un client_id afin de récupérer un code d’accès ;
  • il me faut ensuite générer un couple token & refresh_token ; pour ce faire j’ai besoin à nouveau du client_id…

Il y a moyen de ne pas avoir à le ressaisir ?

Il y a bien une solution qui consiste à le placer dans un paramètre de l’URL de retour mais est-ce une bonne approche ?

Hum… Quoi que je n’arrive pas à passer de paramètres à l’URL de redirection :-/

Bonjour à tous,

Bon, pas mal de difficultés avec cette authentification… Commençons par la doc de l’API en question : Netatmo Connect | Authentication

Pour créer un objet station, je dois donc commencer par récupérer un code via OAuth2 en fournissant un cliendt_id ; puis, avec ce même client_id et le code récupéré plus un secret_id, je récupère un jeu de token / refresh_token qui me permettent de récupérer les stations météo associées dans un select.

Je ne peux utiliser le multi-étapes donc je passe par plusieurs formulaires successifs mais plusieurs difficultés :

  • comment faire avec le paramètre « state » ?

To ensure the security of the process, you should generate and store a state parameter which is unique to this request. The state parameter is an arbitrary string you choose. It will be passed back to your application as a parameter of the redirect_uri when the user completes the authentication flow. Before trusting the authorization response, you should check that the returned state parameter matches the one sent in the request.
Use of the state parameter helps to prevent Cross-site Request Forgery.

Comment puis-je passer d’un formulaire à l’autre cette chaîne ?

  • le client_id est nécessaire à nouveau pour générer les tokens ; l’idéal serait de ne pas à nouveau solliciter l’utilisateur pour quelque chose qu’il a déjà saisi. Mais l’idéal est aussi de ne pas stocker cet id…

Merci encore et par avance pour vos éclaircissements, pistes, solutions… !

Théoriquement, ce state ne devrait-il pas être dans un cookie de session ?

Le 22/02/2023 à 08:00, Brice Boucard via Discuter de SPIP a écrit :

Comment puis-je passer d’un formulaire à l’autre cette chaîne ?

Tu peux pas donner un truc propre à l’utilisateur qui fait le processus de création ? Comme ça tu le connais forcément encore dans ton autre form SPIP pour le vérifier. Par ex un champ de son spip_auteurs, par ex son jeton « cookie_oubli » : |$jeton = auteur_attribuer_jeton($id_auteur);|


RastaPopoulos

Merci beaucoup pour vos retours et l’idée d’utiliser une valeur déjà existante est plus qu’intéressante; mais l’utilisation du cookie_oubli ne représente-t-elle pas un risque de sécurité ?

J’ai donc tout de même essayé en récupérant le ’cookie_oubli et en l’envoyant en prenant bien soin de le traiter avec urlencode() mais lorsqu’il m’est renvoyé, il n’est pas « traité » : les + apparaissent tels quels par exemple, et un _request('state') me renvoie une chaîne avec des espaces à la place…