Criei um aplicativo que usa a API do Discourse e o SSO como provedor.
Atualmente, o aplicativo é exibido dentro de um iframe e, para que o login social funcione corretamente, a página /login precisa ser aberta fora do iframe, em uma nova aba do navegador.
Até aqui, tudo bem.
Problema
Quando um novo usuário se registra usando um botão de login social, ele é redirecionado corretamente para o site social. Porém, ao retornar ao Discourse, é aí que surge o problema: o Discourse exibe o modal de login em vez daquele com o nome de usuário/e-mail já preenchidos.
Para ver o modal correto e finalizar seu registro, você precisa fechar o modal de login e, em seguida, clicar manualmente no botão de cadastro.
Apenas para novos usuários, o login funciona como esperado.
Será que estou esquecendo algo ou há algum contexto que o Discourse não está lidando corretamente? Tecnicamente, deveria ser a mesma coisa.
Se quiser ver uma demonstração, por favor, me avise. Posso enviar um vídeo rápido por MP (ele contém informações privadas).
Para ser mais preciso, o aplicativo é usado em uma extensão do Chrome. Estamos usando um iframe porque não temos outra opção no momento. Mas, ainda assim, não tenho certeza de qual é a diferença entre abrir programaticamente uma nova aba no navegador para /login ou /signup diretamente a partir de um iframe e abrir manualmente uma aba e clicar no botão de login/cadastro.
Isso é algo que pode ser corrigido no Discourse?
Atualmente, estamos usando o Discourse como provedor de SSO. Existem outras maneiras?
Se sim, qual seria a melhor maneira de realizar login/cadastro nesse contexto?
Não estou incorporando o Discourse em um iframe. Estou usando a API para exibir mensagens de tópicos.
Não estou tentando fazer login/cadastro dentro de um iframe, pois sites sociais não permitem ser exibidos dentro deles. Por isso, quando o usuário clica em um botão dentro do iframe, abre-se uma nova aba do navegador para a página /login do Discourse.
Tecnicamente, quando o usuário clica no botão de login, uma nova aba é aberta com /session/sso_provider. O return_sso_url conterá uma URL para o backend processar os dados, salvar as informações da sessão do usuário e, em seguida, responder com algum HTML para fechar automaticamente a janela. O aplicativo então detectará que a ação foi concluída e será recarregado automaticamente para poder usar a sessão salva do usuário.
Mesmo que o aplicativo não estivesse em um iframe, provavelmente ocorreria o mesmo. Como se trata de uma extensão de navegador, você não tem escolha a não ser abrir uma nova aba de qualquer forma. Estou me perguntando se existem maneiras melhores de fazer login/cadastro nesse caso.
EDIT: Aqui está uma demonstração (não era para ser pública, mas bem, essa é a maneira mais curta de mostrar o problema e sinto que não expliquei bem o suficiente): snip, vídeo removido, ninguém se importa mesmo
EDIT2: Parece acontecer apenas ao usar a API /session/sso_provider; se eu abrir a URL do Discourse diretamente (ainda a partir de um iframe), parece que o problema não ocorre.