Olá a todos,
Temos uma instância do Discourse incorporada em um iframe dentro de nosso aplicativo, e isso funciona bem como tal. No entanto, quando um usuário não autenticado tenta acessar uma página à qual não tem acesso (que não existe ou é restrita a um grupo), a resposta agora inclui misteriosamente X-Frame-Options: SAMEORIGIN e os navegadores bloqueiam a renderização do frame.
Verifiquei em diferentes versões, começando com a 3.3.1 estável até quase a versão mais recente (último teste em meados da semana passada).
Ele está rodando em um subdomínio diferente do aplicativo principal e configurado para incorporação com allow_embedding_site_in_an_iframe: true e, ao depurar uma instância limpa, notei que, nesse caso, o método conditionally_allow_site_embedding em ApplicationController não é chamado, deixando assim o cabeçalho na resposta (link do GH), e rastreei isso até o lançamento de uma exceção em algum ponto, quebrando assim o fluxo.
Reprodução:
- Execute uma instância limpa do Discourse (ou qualquer instância, na verdade – isso aconteceu em ambientes locais, de teste e de produção) e configure-a com
allow_embedding_site_in_an_iframe: true. - Incorpore-o em um iframe em um site servido via HTTPS usando um caminho inexistente para acionar um erro 404.
Esperado: O navegador permite que o Discourse seja renderizado.
Real: O navegador impede que o Discourse seja renderizado devido à presença de X-Frame-Options: SAMEORIGIN na resposta.
Observação: Ele está rodando através de um Cloudflare apenas com DNS e tentamos excluir o cabeçalho no modo proxy, no entanto, não podemos colocá-lo no modo proxy devido ao CF filtrar cookies que são necessários para nossa implementação personalizada de SSO, então esta é uma opção inviável para nós no momento.