SSO et intégration

Nous avons configuré une instance Discourse avec SSO (utilisant SAML/Shibboleth) et je l’ai paramétrée pour autoriser l’intégration de contenu sur un autre sous-domaine qui utilise également le même SSO.

Voici le problème que je rencontre :

  1. Un utilisateur visite une page sur le sous-domaine X, qui intègre un sujet provenant de Discourse, hébergé sur le sous-domaine Y.
  2. L’utilisateur est redirigé vers le sous-domaine Z pour la connexion SSO. Il est ensuite redirigé vers le sous-domaine X.
  3. La page du sous-domaine X charge le fichier JavaScript d’intégration, qui crée une iframe tentant de récupérer le sujet du forum. Cependant, Discourse (sous-domaine Y) redirige l’iframe vers le sous-domaine Z pour le SSO, et comme l’utilisateur est déjà connecté, il est renvoyé vers l’URL d’intégration de Discourse. Cela entraîne toutefois une erreur 400 « Error Embedding », car l’URL de référence provient maintenant du sous-domaine Z (le sous-domaine SSO) au lieu du sous-domaine X (le domaine approuvé/blanchi pour l’intégration). Discourse renvoie le message « The referer was either not sent, or did not match any of the following hosts » (La référence n’a soit pas été envoyée, soit ne correspond à aucun des hôtes suivants).
  4. Lorsque vous actualisez la page, tout fonctionne parfaitement (c’est-à-dire que le sujet du forum est chargé avec succès), vraisemblablement parce que le navigateur possède désormais un cookie de session valide, ce qui élimine le besoin de rediriger vers le sous-domaine SSO.

Y a-t-il une solution pour régler ce problème correctement ? Pour l’instant, j’ai mis en place un véritable hack terrible : je tente d’abord de charger le sujet du forum dans une iframe cachée, puis j’attends une seconde avant de charger réellement le sujet dans la page visible pour l’utilisateur.

Toute aide ou suggestion serait appréciée !

Après avoir creusé un peu plus, je me demande si une solution légèrement moins bidouillée consisterait à adapter l’approche décrite par @simon dans ce post : Automatically login via SSO - #4 by simon

  1. Activer le paramètre « sso autorise tous les chemins de retour »
  2. Ajouter un iframe caché sur ma page, qui charge https://discourse.example.com/session/sso?return_path=path_to_mypage.html
  3. Lorsque l’utilisateur est connecté (sans interaction, car l’utilisateur est déjà connecté via SSO dans l’application de la page parente) et que l’iframe est redirigé vers mypage.html, il peut communiquer à la page parente via postMessage() que l’utilisateur a été connecté à Discourse, et déclencher le script pour intégrer le sujet du forum.

Cela ne semble toujours pas être la solution idéale, car cela générera des allers-retours supplémentaires (le processus ci-dessus n’est vraiment nécessaire que si l’utilisateur n’est pas déjà connecté à Discourse).

Il me semble que la solution idéale serait qu’il soit possible de préserver l’URL du référent de la page d’intégration lorsqu’elle est redirigée via SSO.

Édité : J’ai implémenté la « bidouille » améliorée décrite ci-dessus dans ce post, et je peux au moins dire qu’elle fonctionne beaucoup mieux que la bidouille originale que j’ai décrite dans le message initial.