Преглед на файлове

implements setCookie.php

Olivier Massot преди 4 години
родител
ревизия
3781aa6fd8
променени са 3 файла, в които са добавени 111 реда и са изтрити 23 реда
  1. 93 21
      doc/problems_resolutions/cross_domain_auth.md
  2. 16 0
      ot_connect/setCookies.php
  3. 2 2
      ot_core/Classes/Service/OpentalentApiService.php

+ 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.
 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:
 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:
 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
     nginx -s reload
 
 
 Je me rend à l'adresse local.admin.opentalent.fr/#/login
 Je me rend à l'adresse local.admin.opentalent.fr/#/login
 
 
 Je m'authentifie en tant que opentalent74
 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 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';
     const DEFAULT_BASE_URI = 'https://api.opentalent.fr';
     protected array $variants_uris = [
     protected array $variants_uris = [
           "preprod.opentalent.fr" => "https://api.preprod.opentalent.fr",
           "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;
     protected object $client;