Olivier Massot 4 лет назад
Родитель
Сommit
3781aa6fd8

+ 93 - 21
doc/problems_resolutions/cross_domain_auth.md

@@ -16,54 +16,126 @@ Les cookies générés par l'authentif auprès de l'api sont donc invisibles pou
 
 Pour tester les solutions, il va falloir simuler un domaine différent.
 
+Dans le cas standard, si je me rend à l'adresse <local.admin.opentalent.fr/#/login>, et que je me connecte 
+en tant que opentalent74, lorsque je me rend à l'adresse <local.sub.opentalent.fr/ohcluses>, 
+j'apparais comme connecté.
+
+
 Je créé l'entrée suivante dans mon /etc/hosts:
 
-    127.0.0.1 local.sub.mydomain.fr
+    127.0.0.1 local.sub.customdomain.fr
+
+Je créé un certificat pour l'adresse local.sub.customdomain.fr
 
 Je me connecte au docker nginx-proxy, et je remplace les domaines dans la conf de nginx:
 
-    sed -i 's/local\.sub\.opentalent\.fr/local.sub.mydomain.fr/g' /etc/nginx/default.conf
+    sed -i 's/local\.sub\.opentalent\.fr/local.sub.customdomain.fr/g' /etc/nginx/conf.d/default.conf
     nginx -s reload
 
 Je me rend à l'adresse local.admin.opentalent.fr/#/login
 
 Je m'authentifie en tant que opentalent74
 
-Je me rend à l'adresse http://local.sub.mydomain.fr/ohcluses
+Je me rend à l'adresse http://local.sub.customdomain.fr/ohcluses
 
 Je ne suis pas connecté.
 
-Je reviens à l'url standard:
 
-Je me connecte au docker nginx-proxy, et je remplace les domaines dans la conf de nginx:
+## Solutions envisagées
 
-    sed -i 's/local\.sub\.mydomain\.fr/local.sub.opentalent.fr/g' /etc/nginx/default.conf
-    nginx -s reload
+### 1- Envoyer les cookies au site depuis l'api via un controller dédié
 
+Lors d'une connexion réussie, l'API enverra une requête POST aux sites ayant des domaines custom et pour lesquelles
+le user a un Access
 
+Un controller dédié côté Typo3 (ex: setCookies.php) génèrera ensuite les cookies avec les noms de domaines correspondant.
 
-## Solutions envisagées
+Pour tester cette solution, j'ajoute une requête curl dans le AuthenticationSuccessListener:
 
-### 
+    http://docker.sub.customdomain.fr/typo3conf/ext/ot_connect/setCookies.php?BEARER=' . $data['token']
 
+Côté setCookie.php, le contenu est simplement:
 
-Lors d'une connexion réussie, l'API enverra une requête POST aux sites ayant des domaines custom et pour lesquelles
-le user a un Access
+    setcookie('BEARER', $_REQUEST['BEARER'], 0, "/", "customdomain.fr");
 
-Un controller dédié côté Typo3 (ex: setCookies.php) génèrera ensuite les cookies avec les noms de domaines correspondant.
+Je teste, je m'assure que:
+
+* le fichier setCookie est bien appelé: oui 
+* la variable `$_REQUEST['BEARER']` est bien définie: oui
+
+Je teste dans mon navigateur:
+
+* je vide mes cookies
+* je me rend à https://local.admin.opentalent.fr/#/login
+* je me connecte en tant que opentalent74
+* je me rend à l'adresse https://local.sub.customdomain.fr/ohcluses
+* je ne suis pas authentifié, et aucun cookie n'apparait.
+
+Raté.
+
+### 2- SetCookie + <img>
+
+Plus de détails sur la solution ici: https://subinsb.com/set-same-cookie-on-different-domains/
+
+Le setcookie.php est de la forme:
+
+    setcookie('BEARER', '123456', 0, "/", "customdomain.fr");
+
+J'ajoute la ligne suivante au front du logiciel:
+
+    <img src="http://local.sub.customdomain.fr/typo3conf/ext/ot_connect/setCookies.php" style="display:none;" />
+
+Je teste de la même façon que pour la solution 1
+
+Le cookie est bien présent: Yes!
+
+
+### 2- SetCookie + <img>
+
+J'ajoute à docker/apps/opentalent-admin-2.0/src/app/config/routing/main.js, ligne 79 :
+
+    setCookie:['getOrganization', 'Restangular', function(getOrganization, Restangular){
+        Restangular.oneUrl('no-x-access-id', 'https://local.sub.customdomain.fr')
+            .withHttpConfig({withCredentials: false})
+            .get()
+            .then(resp => {
+            })
+    }],
+
+Afin de tester plus facilement depuis la page de login du logiciel, je modifie la ligne 14 du fichier 
+docker/apps/opentalent-admin-2.0/src/app/ng-admin-jwt-auth/loginController.js en:
+
+    this.$state.go('switch', { organization_id: response.data.profile.organizationConnected}, {'reload':true, 'inherit':false});
+
+Je relance le `gulp serve`
+
+Le setcookie.php est de la forme:
+
+    setcookie('BEARER', 'azerty', 0, "/", "customdomain.fr");
+
+Je teste de la même façon que pour la solution 1
+
+(...)
+
+Après de nombreuses tentatives et blocages (blocages CORS, variable _POST vide...)
+On décide de laisser tomber cette méthode pour le moment.
+
+
+## Solution retenue et mise en oeuvre
+
+On récupère le champs otherWebsite de la structure
 
+Si ce champs ne matche pas la regex `https?:\/\/.*\.opentalent\.fr`
 
-Etapes:
+Alors, on insère la ligne:
 
-1. Le nom de domaine custom doit être stocké dans le champs Parameters.website:
-* vérifier le contenu actuel
-* reprise des custom_domains dans typo
-* automatiser le tout
-2. Créer un script setCookie dans OtConnect qui recevrait les requêtes post provenant de l'API
-3. Ajouter un hook lors du apiSuccess de l'api pour envoyer la requête post
+    <img src="https://<domain>/typo3conf/ext/ot_connect/setCookies.php?bearer=<bearer>" alt="" style="display:none;" />
 
-La requête envoyée à setCookie doit contenir simplement le BEARER du user nouvellement authentifié.
+où:
+* <domain> est le champs otherWebsite de la table Parameters de la structure à laquelle le user est connecté
+* <bearer> est le token bearer du user connecté
 
-Le fichier setCookie.fr doit générer un cookie correspondant à ce bearer et le renvoyer
+Le setCookie appelé vérifie que le referer est bien en opentalent.fr. Si oui, et si
+la requête a un paramètre BEARER, alors il créé le cookie correspondant dans le bon domaine.
 
 

+ 16 - 0
ot_connect/setCookies.php

@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * This script will set cookies for the websites with a custom domain (not in '.opentalent.fr')
+ *
+ * NB: It is voluntarily kept separated from typo3, in order to stay as light as possible,
+ *      because it will be called from the Opentalent front app.
+ */
+
+if (
+    preg_match("/https?:\/\/(.*\.)?opentalent.fr(\/.*)?/", $_SERVER['HTTP_REFERER'])
+    && isset($_REQUEST['BEARER'])
+)
+{
+    setcookie('BEARER', $_REQUEST['BEARER'], 0, "/");
+}

+ 2 - 2
ot_core/Classes/Service/OpentalentApiService.php

@@ -17,8 +17,8 @@ class OpentalentApiService implements LoggerAwareInterface
     const DEFAULT_BASE_URI = 'https://api.opentalent.fr';
     protected array $variants_uris = [
           "preprod.opentalent.fr" => "https://api.preprod.opentalent.fr",
-          "local.sub.opentalent.fr" => "http://local.nginx.opentalent.fr",
-          "typo3" => "http://local.nginx.opentalent.fr"
+          "local.sub.opentalent.fr" => "http://docker.nginx.opentalent.fr",
+          "typo3" => "http://docker.nginx.opentalent.fr"
     ];
 
     protected object $client;