Le navigateur empêche Discourse de s'afficher dans une iframe malgré une configuration correcte (`X-Frame-Options : SAMEORIGIN`)

Salut à tous,

Nous avons une instance Discourse intégrée dans une iframe au sein de notre application, et cela fonctionne bien en tant que tel. Cependant, lorsqu’un utilisateur non authentifié essaie d’accéder à une page à laquelle il n’a pas accès (qui n’existe pas ou est restreinte par groupe), la réponse inclut maintenant mystérieusement X-Frame-Options: SAMEORIGIN et les navigateurs bloquent le rendu de l’iframe.

J’ai vérifié sur différentes versions, à partir de la version stable 3.3.1 jusqu’à la version la plus récente (dernière vérification en milieu de semaine dernière).

Elle fonctionne sur un sous-domaine différent de l’application parente et est configurée pour l’intégration avec allow_embedding_site_in_an_iframe: true. En déboguant une instance propre, j’ai remarqué que dans un tel cas, la méthode conditionally_allow_site_embedding dans ApplicationController n’est pas appelée, laissant ainsi l’en-tête dans la réponse (lien GH), et j’ai suivi cela jusqu’à une exception levée à un moment donné, interrompant ainsi le flux.

Reproduction :

  1. Exécutez une instance propre de Discourse (ou n’importe quelle instance en fait – cela s’est produit dans des environnements locaux, de test et de production) et configurez-la avec allow_embedding_site_in_an_iframe: true.
  2. Intégrez-la dans une iframe sur un site web servi via HTTPS en utilisant un chemin inexistant pour déclencher une erreur 404.

Attendu : Le navigateur autorise le rendu de Discourse.
Réel : Le navigateur empêche le rendu de Discourse en raison de la présence de X-Frame-Options: SAMEORIGIN dans la réponse.

Note annexe : Elle fonctionne via un Cloudflare uniquement DNS et nous avons essayé de supprimer l’en-tête en mode proxy, cependant, nous ne pouvons pas le mettre en mode proxy car CF filtre les cookies qui sont nécessaires à notre implémentation SSO personnalisée, donc ce n’est pas une option pour nous pour le moment.