SSO e incorporação

Temos uma instância do Discourse configurada com SSO (usando SAML/Shibboleth) e a configurei para permitir a incorporação de conteúdo em outro subdomínio que também utiliza o mesmo SSO.

Aqui está o problema que estou enfrentando:

  1. O usuário acessa uma página no subdomínio X, que incorpora um tópico do Discourse, hospedado no subdomínio Y.
  2. O usuário é redirecionado para o subdomínio Z para fazer login via SSO. Em seguida, é redirecionado de volta para o subdomínio X.
  3. A página no subdomínio X carrega o arquivo JavaScript de incorporação, que cria um iframe tentando carregar o tópico do fórum. No entanto, o Discourse (subdomínio Y) redireciona o iframe para o subdomínio Z para o SSO e, como o usuário já está logado, redireciona de volta para a URL de incorporação do Discourse. Isso resulta em um erro 400 “Erro ao incorporar”, pois a URL de referência agora vem do subdomínio Z (o subdomínio do SSO), em vez do subdomínio X (o domínio aprovado/permitido para incorporação). O Discourse retorna a mensagem “A referência não foi enviada ou não corresponde a nenhum dos seguintes hosts”.
  4. Ao atualizar a página, tudo funciona perfeitamente (ou seja, o tópico do fórum é carregado com sucesso), presumivelmente porque o navegador agora possui um cookie de sessão válido, o que elimina a necessidade de redirecionar para o subdomínio do SSO.

Há algo que eu possa fazer para corrigir isso adequadamente? No momento, tenho uma solução alternativa terrível configurada, que primeiro tenta carregar o tópico do fórum em um iframe oculto e, em seguida, aguarda 1 segundo antes de realmente carregar o tópico na página real visível para o usuário.

Qualquer ajuda ou sugestão será muito apreciada!

Após investigar um pouco mais, me pergunto se uma solução um pouco menos ‘hacky’ seria adaptar a abordagem descrita por @simon neste post: Automatically login via SSO - #4 by simon

  1. Habilitar a configuração “sso permite todos os caminhos de retorno”
  2. Adicionar um iframe oculto na minha página, que carrega https://discourse.example.com/session/sso?return_path=path_to_mypage.html
  3. Quando o usuário estiver logado (sem interação, já que o usuário já foi logado via SSO no aplicativo na página pai) e o iframe for redirecionado para mypage.html, ele pode se comunicar com a página pai via postMessage() informando que o usuário foi logado no Discourse e acionar o script para incorporar o tópico do fórum.

Ainda não parece a solução ideal, pois isso gerará viagens extras (o processo acima só é realmente necessário se o usuário ainda não estiver logado no Discourse).

Parece-me que a solução ideal seria se fosse possível, de alguma forma, preservar a URL de referência da página que está incorporando quando ela for redirecionada através do SSO.

Edição: Implementei o “hack” aprimorado descrito acima neste post e, pelo menos, posso dizer que funciona muito melhor do que o hack original que descrevi no OP.