Sem `Referer:`, sem incorporação

Olá,

Usamos a incorporação do Discourse no Jekyll em New ROOT Web Site! - ROOT — funciona perfeitamente! A menos que o navegador esteja suprimindo o cabeçalho Referer:, caso em que recebemos um erro 400 Bad Request. Teste você mesmo: se alternar para uma janela privada do Firefox (que suprime referências), a incorporação quebra. O mesmo ocorre no Safari, que parece ser um pouco mais rigoroso ao liberar referências.

Verifiquei isso acessando New ROOT Web Site! - Blog - ROOT Forum em uma janela privada do Firefox, o que resultou em um erro HTTP 400; então editei a solicitação para adicionar Referer: https://root.cern/blog/new-web-site/ — e o erro 400 se transformou em um 200 de sucesso.

Temos a opção “incorporar qualquer origem” ativada. Temos comentários apenas para um único site de incorporação. Existe alguma maneira de fazer isso funcionar?

Atenciosamente,
Axel.

Sim, consigo reproduzir isso.

É interessante que os comentários incorporados em https://blog.codinghorror.com/the-cloud-is-just-someone-elses-computer/ funcionem sem problemas em uma janela privada do Firefox. Será que o problema está relacionado ao domínio? Seu blog está em root.cern e seu formulário está em root-forum.cern.ch.

Oi Simon,

Obrigado por analisar isso! Pode muito bem estar relacionado à diferença nos nomes de domínio: consigo imaginar que os navegadores fornecem referenciadores para uma requisição ao mesmo domínio, mas não para um domínio diferente. Mas, embora isso seja interessante, ainda não vejo o que podemos fazer para corrigir isso — não vamos poder usar root.cern como domínio do fórum, e essa incorporação entre domínios parecia ser um recurso fundamental e super útil… Será que isso simplesmente está em risco hoje em dia, dada a melhoria na privacidade, ou você consegue pensar em uma saída?

Uma coisa que talvez eu queira tentar é fazer um proxy reverso de root.cern/forum para root-forum.cern.ch. Assim, a incorporação pode ser feita como se estivesse no mesmo host, e mantemos o referenciador…? Volto em breve :slight_smile:

Abraços,
Axel

Olá,

Agora tenho uma solução muito mais simples. Isso provavelmente deveria ser destacado em Embed Discourse comments on another website via Javascript :

Para incorporação entre sites, nas páginas de incorporação, adicione:

  • <meta name="referrer" content="strict-origin"> com Path Allowlist definido como /.* (porque nenhum caminho será fornecido), ou
  • <meta name="referrer" content="no-referrer-when-downgrade"> com o Path Allowlist real.

Como mencionado em Referrer-Policy header - HTTP | MDN, “Há um esforço dos navegadores para migrar para um valor padrão mais restrito”, e a incorporação do Discourse depende do antigo padrão para incorporação entre hosts.

Abraços, Axel.

Considerando que isso será o padrão de navegador a partir do Chrome 85 (A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin  |  Blog  |  Chrome for Developers), devemos considerar uma alternativa aqui?

Podemos aceitar solicitações que atendam a todas as três condições a seguir:

  • A solicitação contém tanto discourseEmbedUrl quanto Referer
  • O referer está definido para a origem do discourseEmbedUrl
  • O discourseEmbedUrl corresponde a uma das regras de incorporação

Acho que passar o discourseEmbedUrl seria fácil de implementar para a maioria dos usuários.

Apenas um aviso, Tejas - pelo que sei, sem a tag meta, o Safari e o Firefox/Modo Privado suprimem completamente o cabeçalho Referer. O que você sugere pode funcionar no Chrome >= 85, mas adicionar a tag meta parece mais robusto e geral, e suspeito que seja suficientemente simples para a maioria das integrações.