Comentarios "Error Embedding"

TL;DR: Discourse muestra “Error al incrustar” independientemente de los hosts que permita en la configuración de incrustación.

Tengo un sitio publicado en foo.com que incrusta comentarios del foro Discourse en forum.foo.com, lo cual funciona correctamente. Al acceder, por ejemplo, a https://foo.com/blog/2019-11-22/foo-0.9.6-released, los comentarios incrustados se ven sin problemas. En este caso, el código de script para la incrustación en el código fuente de la página se ve así:

<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>

También tengo una versión de desarrollo del sitio ejecutándose en mi máquina local en localhost, donde tengo problemas con la incrustación: sigue mostrando “Error al incrustar” en lugar de los comentarios dentro del HTML generado y devuelto por el foro. Es decir, veo el logotipo del foro y un enlace a él en la esquina superior derecha del área de incrustación, pero en lugar de listar los comentarios solo obtengo ese mensaje de error.

Al acceder, por ejemplo, a http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/, que es la página equivalente a la del sitio de producción, el código de script para la incrustación en el código fuente de la página se ve así:

<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>

Lo probé tanto con como sin la barra final en la configuración discourseEmbedUrl, pero no hace ninguna diferencia.

No tengo acceso directo al servidor donde se ejecuta el foro, pero he entrado en el panel de administración del foro e intentado agregar varios hosts permitidos en la configuración de incrustación. La configuración actual, para el sitio de producción que funciona con incrustación, es:

"Hosts permitidos", "Nombre de clase", "Lista blanca de rutas", "Publicar en categoría"

foo.com, <vacío>, /blog/.*, blog

Lo que he agregado para que funcione con mi versión de desarrollo local del sitio es:

"Hosts permitidos", "Nombre de clase", "Lista blanca de rutas", "Publicar en categoría"

localhost, <vacío>, /blog/.*, blog
localhost:1313, <vacío>, /blog/.*, blog
<mi IP externa/pública tal como la ve el servidor del foro>, <vacío>, /blog/.*, blog
<mi IP externa/pública tal como la ve el servidor del foro>:1313, <vacío>, /blog/.*, blog

Pero ninguna de estas opciones hace que funcione; sigo obteniendo el mismo mensaje de “Error al incrustar”.

Me resisto a meterme en el código fuente y tratar de depurar esto; preferiría recibir alguna orientación sobre qué está verificando Discourse cuando determina que debe generar ese mensaje de error. ¿Alguien puede decírmelo y cómo solucionarlo? Debería ser bastante sencillo, pero Discourse actúa como una caja negra aquí.

He leído todo en Embed Discourse comments on another website via Javascript, pero no ofrece información más útil.

Es posible que quieras utilizar topicID, como se menciona en Embed Discourse comments on another website via Javascript.

No me sorprendería que “localhost” estuviera prohibido por varias razones. Esto le indicaría a tu servidor del foro que se incruste en sí mismo. :dizzy_face:

Si estás usando Hugo, quizás puedas cargar la plantilla de comentarios de forma condicional o pasar baseURL explícitamente en la plantilla, de modo que incluso durante el desarrollo cargues discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'.

@maiki Muchas gracias por tomarte el tiempo de responder.

Usar topicId como se describe en la guía no hace que funcione ni cambia ningún síntoma. Por supuesto, la URL solicitada cambia a https://forum.foo.com/embed/comments?topic_id=2279, pero muestra exactamente el mismo mensaje de error.

También intenté cambiar discourseEmbedUrl a https://foo.com/blog/2019-11-22/foo-0.9.6-released, pero esto tampoco mejoró nada, por desgracia.

Incluso si este comportamiento es intencional, debe estar documentado. Por ejemplo, ¿se bloquean las solicitudes desde un sitio en localhost? Aunque esté explícitamente listado en los hosts permitidos. ¿Discourse examina el campo referrer en la solicitud HTTP, o qué utiliza exactamente para activar este error? Esto realmente necesita aclararse, porque hasta ahora no he encontrado nada que explique por qué no funciona :slight_smile:

¿Cuál es el mensaje de error? ¿Hay algo en la consola de desarrollo?

localhost no es un dominio válido, es un nombre de host.

No estoy seguro de que tenga sentido explicarlo en la guía de incrustación, ¡pero al menos tenemos este tema como referencia! :slight_smile:

No, no hay nada incorrecto en la consola de desarrollo del cliente/navegador en localhost. El HTML se devuelve correctamente desde el servidor del foro; puedo verlo perfectamente en las herramientas de desarrollo.

Así es como debería verse cuando funciona (algo de texto censurado):

Así es como se ve en su lugar (algo de texto censurado):

Así que simplemente el servidor del foro devuelve 400 y “Error al incrustar” en lugar del contenido correcto.

Claro, pero como sugeriste, quizás Discourse esté bloqueando este tipo de solicitudes procedentes de referidores que sean de localhost. Sé que “localhost” no es un nombre de dominio, sino un nombre de host. Esto está en línea con el hecho de que lo que configuras en “Hosts permitidos” en la configuración de incrustación del foro son precisamente eso: hosts.

Sé perfectamente qué es localhost, eso no es un problema.

¿Explicar qué es localhost? No, eso no es necesario. Cuando dije que debemos llegar a una conclusión sobre por qué no funciona para mí y que debe documentarse, me refería en general a por qué no se espera que funcione, si ese es el caso. De nuevo, tal como está ahora, nada sugiere que este sea el comportamiento esperado.

¿Tu sitio de Discourse está configurado como “inicio de sesión requerido”?

La opción llamada “login required” en la sección “Login” está desmarcada, así que no, no lo está.

Pensando en voz alta: ¿qué diferencia hay entre cuando la solicitud proviene de mi sitio de desarrollo local y cuando proviene del sitio de producción? No es mucho. Debería ser solo el referenciador HTTP y, por supuesto, el origen de la solicitud HTTP. Aparte de eso, estoy usando el mismo navegador para ambos sitios.

Puedes probar si es un problema del host intentando incrustarlo en otro dominio activo (quizás un subdominio de uno que tengas).

Pensando en voz alta: si le digo a Discourse que acepte “localhost”, lo buscará en localhost, que es el servidor de Discourse.

¡Buena suerte! No sé qué está pasando. :slight_smile:

1 me gusta

Entiendo tu razonamiento. Es entonces cuando resulta interesante saber a qué está mirando realmente cuando determina el acceso y si debe o no mostrar este mensaje de error.

En un tema relacionado, el caso es que (Discourse, al responder a la solicitud incrustada) devuelve un código de respuesta HTTP 400, lo que simplemente significa “Solicitud incorrecta”. Si tuviera algo que ver con un host no permitido o algo similar, esperaría que el código fuera 401 (“No autorizado”) o algo parecido, pero no es así. Esto sugiere que no tiene que ver con la autorización ni con los hosts permitidos. Pero también podría ser que el código del backend simplemente no está generando un código de respuesta HTTP adecuado.

Seguro que alguien debe saber si debería ser posible incrustar comentarios desde el dominio forum.foo.com en un sitio web de desarrollo en localhost. No veo nada que indique que no debería funcionar (al permitir hosts), pero como no lo hace, resulta bastante confuso.

Parece que hay algo más grande en marcha.
Las cabeceras X-Frame-Options están configuradas en ALLOWALL.
Pero ALLOWALL no es una opción; consulta X-Frame-Options header - HTTP | MDN
Si intento incrustar los comentarios, obtengo el siguiente error: Se encontró una cabecera X-Frame-Options inválida al cargar ... 'ALLOWALL' no es una directriz válida.
Solo cuando uso topicId los comentarios se cargan. Pero creo que esto se debe a que no necesitas el permiso completo cuando solo incrustas los comentarios.

Gracias por reportarlo. ¿En qué navegador estás obteniendo el error? ¿El navegador está actualizado?

Está en Firefox y está actualizado. Revisé Chrome, pero no me dio ningún error; simplemente no funcionaba.

1 me gusta

En caso de que alguien esté interesado, describí mi instancia del problema con detalle anteriormente, y por alguna razón la incrustación de comentarios funcionó perfectamente cuando finalmente publicamos el sitio.

Es decir, el problema y los síntomas que describí anteriormente ocurrían cuando ejecutaba el sitio web que incrusta los comentarios de forum.domain.com en mi propio sistema, como localhost o similar. Pero cuando publiqué el sitio web en domain.com, funcionó de inmediato.

Como ya he dicho, no puedo encontrar nada en la configuración del foro que prohíba el acceso o la incrustación de comentarios desde fuentes distintas a domain.com, por lo que sigue siendo un misterio por qué esto no funcionaba, al menos para mí. Debe haber algo en el código de Discourse que lo impida, pero no sé qué es.

He estado intentando reproducir este problema, pero hasta ahora no he podido. Con el script de incrustación predeterminado, los comentarios se muestran sin errores en los navegadores Chrome y Firefox más recientes (en ejecución en Ubuntu).

Otra cosa que debes verificar es asegurarte de haber creado el registro de host en la sección Administración / Personalizar / Incrustación de tu sitio. Lo menciono porque estaba recibiendo un error al probar esto porque no había completado la configuración “Nombre de usuario para la creación de temas” y guardado la configuración de incrustación.

1 me gusta

Tuve un problema similar y lo solucioné cambiando los Allowed Hosts en Admin > Customize > Embedding de example.com a www.example.com y funcionó. Tengo mi foro instalado en subdomain.example.com y tal vez por eso estaba causando problemas.

De todos modos, no estoy seguro de si eso te ayudará, ¡pero espero que sí!