Commentaires "Error Embedding"

TL;DR : Discourse affiche une « Erreur d’intégration » quelle que soit la liste des hôtes autorisés dans les paramètres d’intégration.

J’ai un site publié sur foo.com qui intègre les commentaires d’un forum Discourse hébergé sur forum.foo.com, ce qui fonctionne parfaitement. Lorsque je visite par exemple https://foo.com/blog/2019-11-22/foo-0.9.6-released, les commentaires intégrés s’affichent sans problème. Dans ce cas, le code JavaScript d’intégration présent dans le code source de la page ressemble à ceci :

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

J’ai également une version de développement du site qui tourne localement sur localhost, où je rencontre des problèmes d’intégration : le système affiche constamment « Erreur d’intégration » au lieu d’afficher les commentaires générés et renvoyés par le forum. Autrement dit, je vois le logo du forum et un lien vers celui-ci en haut à droite de la zone d’intégration, mais au lieu d’une liste de commentaires, seul le message d’erreur s’affiche.

Lorsque je visite par exemple http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/, qui correspond à la page équivalente du site de production, le code JavaScript d’intégration présent dans le code source de la page ressemble à ceci :

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

J’ai testé avec et sans le slash final dans le paramètre discourseEmbedUrl, sans aucune différence.

Je n’ai pas d’accès direct au serveur sur lequel le forum est hébergé, mais je suis allé dans le panneau d’administration du forum et j’ai essayé d’ajouter plusieurs hôtes autorisés dans les paramètres d’intégration. Les paramètres actuels, pour le site de production qui fonctionne correctement avec l’intégration, sont les suivants :

« Hôtes autorisés », « Nom de classe », « Liste blanche des chemins », « Publier dans la catégorie »

foo.com, <vide>, /blog/.*, blog

Ce que j’ai ajouté pour tenter de faire fonctionner la version de développement locale de mon site :

« Hôtes autorisés », « Nom de classe », « Liste blanche des chemins », « Publier dans la catégorie »

localhost, <vide>, /blog/.*, blog
localhost:1313, <vide>, /blog/.*, blog
<mon adresse IP externe/publique telle que vue par le serveur du forum>, <vide>, /blog/.*, blog
<mon adresse IP externe/publique telle que vue par le serveur du forum>:1313, <vide>, /blog/.*, blog

Mais rien de tout cela ne fonctionne ; je continue d’obtenir le même message « Erreur d’intégration ».

Je suis réticent à plonger dans le code source pour essayer de déboguer ce problème ; je préférerais obtenir des informations sur ce que Discourse vérifie lorsqu’il décide de générer ce message d’erreur. Quelqu’un peut-il me l’expliquer et m’indiquer comment résoudre ce problème ? Cela devrait être assez simple, mais Discourse se comporte ici comme une boîte noire.

J’ai lu tout le contenu de Embed Discourse comments on another website via Javascript, mais cela ne fournit pas d’informations plus utiles.

Vous voudrez peut-être utiliser topicID, comme mentionné sur Embed Discourse comments on another website via Javascript.

Je ne serais pas surpris que “localhost” soit interdit pour diverses raisons. Cela indiquerait à votre serveur de forum de s’intégrer sur lui-même. :dizzy_face:

Si vous utilisez Hugo, chargez peut-être le modèle de commentaire de manière conditionnelle, ou passez baseURL explicitement dans le modèle, afin que même pendant le développement, vous chargiez discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'.

@maiki Merci beaucoup d’avoir pris le temps de répondre.

L’utilisation de topicId comme décrit dans le guide ne permet pas de faire fonctionner la chose ni de modifier les symptômes. L’URL demandée change bien pour devenir https://forum.foo.com/embed/comments?topic_id=2279, mais le message d’erreur reste exactement le même.

J’ai également essayé de modifier discourseEmbedUrl en https://foo.com/blog/2019-11-22/foo-0.9.6-released, mais cela n’a malheureusement rien arrangé.

Même si cela est intentionnel, cela doit être documenté. Par exemple, les requêtes provenant d’un site localhost sont-elles bloquées ? Même si localhost est explicitement listé dans les hôtes autorisés ? Discourse examine-t-il le champ Referer dans la requête HTTP, ou utilise-t-il exactement quoi pour déclencher cette erreur ? Il est vraiment nécessaire que cela soit clarifié, car à ce stade, je n’ai trouvé aucun élément expliquant pourquoi cela ne fonctionne pas :slight_smile:

Quel est le message d’erreur ? Y a-t-il quelque chose dans la console de développement ?

localhost n’est pas un domaine valide, c’est un nom d’hôte.

Je ne suis pas sûr qu’il soit pertinent d’expliquer cela dans le guide d’intégration, mais au moins, nous avons ce sujet pour référence ! :slight_smile:

Non, il n’y a rien d’anormal dans la console de développement sur le client/navigateur localhost. Le HTML est renvoyé avec succès par le serveur du forum ; je peux le voir parfaitement dans les outils de développement.

Voici à quoi cela devrait ressembler lorsque cela fonctionne (certains textes censurés) :

Voici à quoi cela ressemble en réalité (certains textes censurés) :

Donc, le serveur du forum renvoie simplement un code 400 et le message « Error Embedding » au lieu du contenu approprié.

Bien sûr, mais comme vous l’avez suggéré, peut-être que Discourse bloque ce type de requête provenant de référents issus de localhost. Je sais que « localhost » n’est pas un nom de domaine mais un nom d’hôte. Cela va dans le sens du fait que ce que vous configurez pour « Hosts autorisés » dans les paramètres d’intégration du forum sont précisément cela : des hôtes.

Je sais parfaitement ce qu’est localhost, ce n’est pas un problème.

Expliquer ce qu’est localhost ? Non, ce n’est pas nécessaire. Quand j’ai dit que nous devions arriver à une conclusion sur la raison pour laquelle cela ne fonctionne pas pour moi et que cela doit être documenté, je parlais en général de la raison pour laquelle cela n’est pas censé fonctionner, si tel est le cas. Encore une fois, tel que cela se présente actuellement, rien ne suggère qu’il s’agisse d’un comportement attendu.

Votre site Discourse est-il configuré en mode « connexion requise » ?

Le paramètre nommé « login required » dans la section « Connexion » n’est pas coché, donc non, il ne l’est pas.

En réfléchissant à voix haute : ce qui diffère entre une requête provenant de mon site de développement local et une requête provenant du site de production n’est pas grand-chose. Il s’agit simplement du référent HTTP et, bien sûr, de la source de la requête HTTP. À part cela, j’utilise le même navigateur pour les deux sites.

Vous pouvez vérifier s’il s’agit d’un problème d’hébergement en essayant de l’intégrer sur un autre domaine en ligne (peut-être un sous-domaine que vous possédez).

Je réfléchis à voix haute : si j’ai demandé à Discourse d’accepter « localhost », il le recherchera sur localhost, qui est le serveur Discourse.

Bon courage ! Je ne sais pas ce qui se passe. :slight_smile:

1 « J'aime »

Je comprends votre raisonnement. C’est alors qu’il devient intéressant de savoir sur quoi il se base réellement lorsqu’il détermine l’accès et s’il doit ou non afficher ce message d’erreur.

Sur un sujet connexe, le fait est que cela (Discourse, lorsqu’il répond à la requête intégrée) renvoie un code de réponse HTTP 400, ce qui signifie simplement « Mauvaise requête ». S’il s’agissait d’un problème lié à un hôte non autorisé ou similaire, je m’attendrais à ce que le code soit 401 (« Non autorisé ») ou similaire, mais ce n’est pas le cas. Cela suggère donc que cela n’a rien à voir avec l’autorisation ou les hôtes autorisés. Mais il est tout aussi possible que le code backend ne renvoie tout simplement pas un code de réponse HTTP approprié.

Certainement, quelqu’un doit savoir s’il est possible ou non d’intégrer des commentaires depuis le domaine forum.foo.com sur un site de développement en localhost ? Je ne vois rien indiquant que cela ne devrait pas fonctionner (en autorisant les hôtes), mais comme ce n’est pas le cas, c’est plutôt flou.

Il semble qu’il se passe quelque chose de plus important.
Les en-têtes X-Frame-Options sont définis sur ALLOWALL.
Mais ALLOWALL n’est pas une option valide, consultez X-Frame-Options header - HTTP | MDN
Lorsque j’essaie d’intégrer les commentaires, je reçois l’erreur suivante : Un en-tête X-Frame-Options invalide a été détecté lors du chargement de ... 'ALLOWALL' n'est pas une directive valide.
Seulement lorsque j’utilise topicId, les commentaires se chargent. Mais je pense que c’est parce que vous n’avez pas besoin de l’autorisation complète lorsque vous intégrez simplement les commentaires.

Merci de nous avoir signalé cela. Quel navigateur utilisez-vous lorsque l’erreur se produit ? Votre navigateur est-il à jour ?

C’est sur Firefox et c’est à jour. J’ai vérifié sur Chrome, mais cela ne m’a donné aucune erreur, cela ne fonctionnait tout simplement pas.

1 « J'aime »

Au cas où cela intéresserait quelqu’un, j’ai décrit ma propre version du problème en détail plus tôt, et pour une raison quelconque, l’intégration des commentaires a parfaitement fonctionné lorsque nous avons enfin publié le site.

Autrement dit, le problème et les symptômes que j’ai décrits précédemment se produisaient lorsque j’exécutais le site web qui intègre les commentaires de forum.domain.com sur mon propre système, comme localhost ou similaire. Mais lorsque j’ai publié le site sur domain.com, cela a fonctionné immédiatement.

Comme je l’ai déjà dit, je ne trouve rien dans les paramètres du forum qui interdise l’accès ou l’intégration de commentaires provenant d’autres sources que domain.com. Donc, pourquoi cela ne fonctionnait pas reste un mystère pour moi. Il doit y avoir quelque chose dans le code de Discourse qui l’empêche, mais quoi, je ne le sais pas.

J’ai essayé de reproduire ce problème, mais je n’ai pas encore réussi. Avec le script d’intégration par défaut, les commentaires s’affichent chez moi sans aucune erreur, à la fois sur les dernières versions de Chrome et de Firefox (exécutées sous Ubuntu).

Une autre chose à vérifier est de vous assurer que vous avez créé l’enregistrement hôte dans la section Administration / Personnalisation / Intégration de votre site. Je le mentionne car j’ai rencontré une erreur lors de mes tests parce que je n’avais pas rempli le paramètre « Nom d’utilisateur pour la création de sujets » et enregistré les paramètres d’intégration.

1 « J'aime »

J’avais un problème similaire je pense et je l’ai résolu en changeant les Hôtes Autorisés dans Admin > Personnaliser > Intégration de example.com à www.example.com et ça a fonctionné. J’ai mon forum installé sur subdomain.example.com et c’est peut-être pour ça que ça posait problème.

Enfin, je ne suis pas sûr que cela vous aide, mais j’espère que oui !