Pārlūkot izejas kodu

add doc/helloasso.md

Olivier Massot 3 mēneši atpakaļ
vecāks
revīzija
c72ea79ef8
1 mainītis faili ar 108 papildinājumiem un 0 dzēšanām
  1. 108 0
      doc/helloasso.md

+ 108 - 0
doc/helloasso.md

@@ -0,0 +1,108 @@
+## Helloasso
+
+> Voir : 
+> https://ressources-opentalent.atlassian.net/wiki/spaces/SPEC/pages/421822467/User+Stories#La-mire-de-connexion
+> https://dev.helloasso.com/docs/mire-authorisation#2-enregistrement-de-votre-domaine-de-redirection
+
+### Principe général
+
+Une Organization doit pouvoir associer son compte Opentalent à son compte Helloasso. Ce lien permettra 
+ensuite des interactions avec HelloAsso comme par exemple le paiement de factures (en une ou plusieurs fois) 
+ou l’affichage de billetteries HelloAsso sur les pages de détails des évènements (agenda, sites Typo3).
+
+
+### Configuration initiale
+
+Les identifiants et clés d'API sont fournis par Helloasso, et enregistrés comme variables d'environnement (voir variables 
+`HELLOASSO_****`).
+
+On enregistre comme domaine de redirection le domaine opentalent.fr : https://opentalent.fr/ 
+(voir: `ConnectionService::setupOpentalentDomain()`)
+
+### Sandbox
+
+Toutes les URLs mentionnées ici ont une version équivalente de test : 
+
+* xxx.helloasso.com : Version de production
+* xxx.helloasso-sandbox.com : Version de test
+
+### Mise en oeuvre
+
+Pour lier une Organization à son compte Helloasso : 
+
+1. Se connecter à HelloAsso : un bouton "se connecter avec HelloAsso" est présent sur une page du logiciel. Il permet de rediriger l'utilisateur vers la page de connexion HelloAsso.
+2. Une fois identifié, Helloasso redirige le visiteur vers une page de callback dont on a fourni l'url au préalable. Ce retour s'accompagne d'un jeton d'autorisation HelloAsso que l'on récupère.
+3. Grâce à ce jeton d'autorisation, on récupère auprès de l'API HelloAsso un jeton d'accès (durée de vie: 30min) et un jeton de renouvellement (durée de vie: 30jours).
+4. Ce jeton d'accès est stocké en base, et sera ensuite attaché aux requêtes envoyées à l'API HelloAsso.
+
+A noter qu'on renouvelle ce jeton stocké en base de manière régulière afin que celui ci reste valide.
+
+Par ailleurs, l'utilisateur peut : 
+
+* dissocier son compte Helloasso de son compte Opentalent
+
+#### Se connecter avec HelloAsso
+
+La [page HelloAsso](https://local.app.opentalent.fr/helloasso) du front (V2) donne accès à un bouton "se connecter avec HelloAsso".
+
+Ce bouton permet de rediriger l'utilisateur vers la page de connexion HelloAsso : `https://auth.helloasso.com/authorize?<params>`
+
+On ajoute à cette URL une query composée des éléments suivants :
+
+* `client_id` : l'identifiant client Opentalent enregistré comme variable d'environnement.
+* `redirect_uri` : l'url vers laquelle l'utilisateur sera redirigé après s'être authentifié.
+* `code_challenge`: code challenge PKCE à générer en amont (voir : `OAuthPkceGenerator::generatePkce()`).
+* `code_challenge_method` : méthode du test, doit être égal à "S256".
+* `state` : *optionnel, utilité à revoir*.
+
+Une fois redirigé vers cette URL, l'utilisateur a accès à un formulaire de connexion lui permettant 
+de se connecter à son compte Helloasso. 
+
+
+#### Le callback après authentification
+
+Une fois l'authentification effectuée via le formulaire HelloAsso, l'utilisateur est redirigé vers l'URL de 
+callback fournie précédemment, URL à laquelle aura été ajoutée une query.
+
+Cette query de retour contient :
+
+* Un authorization_code en cas de succès
+* Un message d'erreur en cas de problème de configuration.
+
+A ce niveau là, si tout s'est bien déroulé, on dispose donc d'un jeton d'autorisation HelloAsso `authorization_code`.
+
+#### Récupérer et stocker les jetons d'accès
+
+On adresse ensuite une requête POST à l'adresse https://api.helloasso.com/oauth2/token, 
+contenant le body suivant (`application/x-www-form-urlencoded`) : 
+
+* `client_id` : l'identifiant client Opentalent enregistré comme variable d'environnement.
+* `client_secret` : la clé secrète Opentalent enregistré comme variable d'environnement.
+* `grant_type`: doit valoir 'authorization_code'.
+* `code`: l'authorization_code fourni précédemment.
+* `code_verifier`: la chaine de caractère générée pour le challenge, avant encodage *à revoir*.
+* `redirect_uri` : *à revoir*.
+
+On récupère ensuite une réponse JSON de la forme : 
+
+* `access_token` : le jeton qui servira pour les requêtes vers l'API, valable 30 min.
+* `refresh_token` : Le jeton permettant de demander le renouvellement de l'access_token, valable 30 jours.
+* `token_type` : doit valoir "bearer".
+* `expires_in` : la durée de validité du token d'accès, en secondes.
+* `organization_slug` : le slug de l'organization que l'on vient de connecter.
+
+On stocke enfin dans la table HelloAsso les valeurs de `access_token`, `refresh_token` et `organization_slug`, associées
+à l'id de l'Organization.
+
+#### Envoyer une requête à l'API HelloAsso
+
+TODO: à compléter
+
+#### Le renouvellement du jeton d'accès
+
+TODO: à compléter
+
+#### Dissocier le compte Helloasso de son compte Opentalent
+
+Pour dissocier le compte HelloAsso du compte Opentalent, il suffira de supprimer la ligne correspondant à 
+l'Organization dans la table `HelloAsso`.