Comentários "Erro de Incorporação"

TL;DR: O Discourse exibe “Erro ao incorporar” independentemente dos hosts que eu permito nas configurações de incorporação.

Tenho um site publicado em foo.com que incorpora comentários do fórum Discourse em forum.foo.com, o que está funcionando perfeitamente. Ao acessar, por exemplo, https://foo.com/blog/2019-11-22/foo-0.9.6-released, os comentários incorporados aparecem corretamente. Neste caso, o código do script para a incorporação no código-fonte da página se parece com isto:

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

Também tenho uma versão de desenvolvimento do site rodando no meu computador local em localhost, onde estou com problemas na incorporação — ela continua exibindo “Erro ao incorporar” em vez de mostrar os comentários dentro do HTML gerado e retornado pelo fórum. Ou seja, vejo o logotipo do fórum e um link para ele no canto superior direito da área de incorporação, mas, em vez de listar os comentários, recebo apenas essa mensagem de erro.

Ao acessar, por exemplo, http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/, que é a página equivalente à do site de produção, o código do script para a incorporação no código-fonte da página se parece com isto:

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

Testei tanto com quanto sem a barra final na configuração discourseEmbedUrl, mas não faz diferença alguma.

Não tenho acesso direto ao servidor onde o fórum está rodando, mas entrei no painel administrativo do fórum e tentei adicionar vários hosts permitidos nas configurações de incorporação. As configurações atuais, para o site de produção que funciona com incorporação, são:

"Hosts Permitidos", "Nome da Classe", "Lista Branca de Caminhos", "Publicar na Categoria"

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

O que adicionei para tentar fazer funcionar na minha versão de desenvolvimento local em localhost é:

"Hosts Permitidos", "Nome da Classe", "Lista Branca de Caminhos", "Publicar na Categoria"

localhost, <vazio>, /blog/.*, blog
localhost:1313, <vazio>, /blog/.*, blog
<meu IP externo/público conforme visto pelo servidor do fórum>, <vazio>, /blog/.*, blog
<meu IP externo/público conforme visto pelo servidor do fórum>:1313, <vazio>, /blog/.*, blog

Mas nada disso faz funcionar; continuo recebendo a mesma mensagem de “Erro ao incorporar”.

Estou relutante em mergulhar no código-fonte e tentar depurar isso; prefiro obter alguma orientação sobre o que o Discourse verifica ao determinar que deve gerar essa mensagem de erro. Alguém pode me dizer isso e como corrigir? Deveria ser bem simples, mas o Discourse está agindo como uma caixa preta aqui.

Li tudo em Embed Discourse comments on another website via Javascript, mas não fornece informações mais úteis.

Talvez você queira usar topicID, conforme mencionado em Embed Discourse comments on another website via Javascript.

Não me surpreenderia se “localhost” fosse proibido por vários motivos. Isso instruiria seu servidor do fórum a incorporar a si mesmo. :dizzy_face:

Se você estiver usando o Hugo, talvez seja carregar o modelo de comentários condicionalmente ou passar o baseURL explicitamente no modelo, para que, mesmo durante o desenvolvimento, você carregue discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'.

@maiki Muito obrigado por dedicar um tempo para responder.

Usar topicId conforme descrito no guia não faz funcionar nem altera nenhum sintoma. A URL solicitada, é claro, muda para https://forum.foo.com/embed/comments?topic_id=2279, mas exibe exatamente a mesma mensagem de erro.

Também tentei alterar o discourseEmbedUrl para https://foo.com/blog/2019-11-22/foo-0.9.6-released, mas isso, infelizmente, também não melhorou nada.

Mesmo que o caso seja que isso seja intencional, precisa ser documentado. Por exemplo, as requisições de um site em localhost são bloqueadas? Mesmo estando explicitamente listadas nos hosts permitidos? O Discourse está verificando o campo referrer na requisição HTTP, ou o que exatamente está sendo usado para disparar esse erro? Isso realmente precisa ser esclarecido, porque, até agora, nada que encontrei explica por que não está funcionando :slight_smile:

Qual é a mensagem de erro? Há algo no console de desenvolvimento?

localhost não é um domínio válido; é um nome de host.

Não tenho certeza se faz sentido explicar isso no guia de incorporação, mas pelo menos temos este tópico como referência! :slight_smile:

Não, não há nada de errado no console de desenvolvimento no cliente/navegador local. O HTML é retornado com sucesso pelo servidor do fórum; consigo vê-lo perfeitamente nas ferramentas de desenvolvimento.

Veja como deveria ser quando está funcionando (algum texto censurado):

E assim é como aparece no meu caso (algum texto censurado):

Ou seja, o servidor do fórum apenas retorna 400 e “Erro ao incorporar” em vez do conteúdo correto.

Claro, mas como você sugeriu, talvez o Discourse esteja bloqueando esse tipo de requisição de remetentes que vêm de localhost. Eu sei que “localhost” não é um nome de domínio, mas um nome de host. Isso está alinhado com o fato de que o que você configura em “Hospitais Permitidos” nas configurações de incorporação do fórum são exatamente isso: hosts.

Eu sei perfeitamente o que é localhost, isso não é um problema.

Explicar o que é localhost? Não, isso não é necessário. Quando disse que precisamos chegar a uma conclusão sobre por que não está funcionando para mim e que isso precisa ser documentado, estou falando, de modo geral, sobre por que isso não é esperado para funcionar, caso seja esse o caso. Mais uma vez, como está agora, nada sugere que esse seja o comportamento esperado.

Seu site Discourse está configurado como login obrigatório?

A configuração chamada “login obrigatório” na seção “Login” está desmarcada, então não, não está.

Pensando em voz alta: a diferença entre quando a solicitação vem do meu site de desenvolvimento local e quando vem do site de produção não é grande. Deve ser apenas o referrer HTTP e, claro, a origem da solicitação HTTP. Fora isso, estou usando o mesmo navegador para ambos os sites.

Você pode testar se o problema é do servidor tentando incorporá-lo em outro domínio ativo (talvez um subdomínio de um que você já tenha).

Eu pensando em voz alta: se eu disser ao Discourse para aceitar “localhost”, ele vai procurá-lo em localhost, que é o servidor do Discourse.

Boa sorte! Não sei o que está acontecendo. :slight_smile:

Entendo seu raciocínio. É aí que se torna interessante saber exatamente o que ele está verificando ao determinar o acesso e se deve ou não exibir essa mensagem de erro.

Em uma nota relacionada, o ponto é que ele (o Discourse, ao responder à solicitação incorporada) retorna um código de resposta HTTP 400, que simplesmente significa “Bad Request” (Solicitação Inválida). Se estivesse relacionado a um host não permitido ou algo similar, eu esperaria que o código fosse 401 (“Unauthorized” - Não Autorizado) ou algo parecido, mas não é o caso. Isso sugere que não tem a ver com autorização ou hosts permitidos. Mas também pode ser que o código do backend simplesmente não esteja retornando um código de resposta HTTP adequado.

Com certeza alguém deve saber se é ou não possível incorporar comentários do domínio forum.foo.com a partir de um site de desenvolvimento em localhost? Não vejo nada que diga que não deveria funcionar (ao permitir hosts), mas como não funciona, é bastante confuso.

Parece que há algo maior acontecendo.
Os cabeçalhos X-Frame-Options estão definidos como ALLOWALL.
Mas ALLOWALL não é uma opção; veja X-Frame-Options header - HTTP | MDN
Se eu tentar incorporar os comentários, recebo o seguinte erro: Um cabeçalho X-Frame-Options inválido foi encontrado ao carregar ... 'ALLOWALL' não é uma diretriz válida.
Somente ao usar topicId os comentários são carregados. Mas acho que isso ocorre porque você não precisa da permissão completa ao incorporar apenas os comentários.

Obrigado por relatar isso. Em qual navegador você está recebendo o erro? O navegador está atualizado?

Está no Firefox e está atualizado. Verifiquei no Chrome, mas ele não apresentou nenhum erro, apenas não funcionou.

Caso alguém esteja interessado, descrevi minha versão do problema em detalhes anteriormente e, por algum motivo, a incorporação de comentários funcionou perfeitamente quando finalmente publicamos o site.

Ou seja, o problema e os sintomas que descrevi anteriormente ocorriam quando eu executava o site que incorpora os comentários de forum.domain.com no meu próprio sistema, como localhost ou algo similar. Mas quando publiquei o site em domain.com, ele funcionou imediatamente.

Como já disse anteriormente, não consigo encontrar nada nas configurações do fórum que impeça o acesso ou a incorporação de comentários de fontes diferentes de domain.com, então por que isso não funcionava continua sendo um mistério para mim. Deve haver algo no código do Discourse que o impede, mas não sei o que é.

Tenho tentado reproduzir esse problema, mas até agora não consegui. Com o script de incorporação padrão, os comentários aparecem para mim sem erros tanto no Chrome quanto no Firefox mais recentes (rodando no Ubuntu).

Outra coisa para verificar é garantir que você criou o registro de host na seção Admin / Personalizar / Incorporação do seu site. Estou mencionando isso porque estava recebendo um erro ao testar, pois não havia preenchido a configuração “Nome de usuário para criação de tópico” e salvo as configurações de incorporação.

Eu estava tendo um problema semelhante, acho, e corrigi alterando os Hosts Permitidos em Admin > Personalizar > Incorporação de example.com para www.example.com e funcionou. Tenho meu fórum instalado em subdomain.example.com e talvez seja por isso que estava causando problemas.

De qualquer forma, não tenho certeza se isso vai te ajudar, mas espero que sim!