Login no Discourse redireciona para o Painel do WordPress

Quando configurei o SSO com o WordPress originalmente, os usuários acessavam a URL do fórum, eram redirecionados para a página de login do WordPress e, após o login, eram redirecionados de volta ao fórum.

Mas em algum momento, isso mudou e não faço ideia de como. Agora, após o login no WordPress, o usuário é redirecionado para o painel do WordPress.

Além disso, outra coisa estranha é que, quando faço logout no Discourse, vejo a mensagem “Você foi desconectado”, mas ao clicar no botão “Atualizar”, não fui realmente desconectado. Ainda consigo postar, responder etc. Às vezes, preciso fazer logout 2 ou 3 vezes até ser realmente desconectado. Então funciona, só não de forma consistente.

Alguma ideia de como posso solucionar isso?

Provavelmente, há um plugin do WordPress interferindo em suas rotas e/ou se conectando às suas funções de login. Basta desativar metade dos plugins do WordPress e ver qual metade está causando o problema; em seguida, desative metade dos plugins desse grupo, e assim por diante.

Comece com os plugins relacionados a autenticação, membros e login.

A resposta do Michael provavelmente está correta. Além disso, você tem o plugin WooCommerce instalado no seu site? Se sim, há um código que você pode adicionar ao seu site para resolver o problema.

O problema de logout pode estar relacionado ao problema de redirecionamento de login. Se desativar os plugins não resolver o problema, avise-nos.

Se você não quiser desativar os plugins para todos os seus usuários, pode desativá-los apenas para sua sessão individual com o plugin WordPress Health Check: Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada).

Obrigado, Michael e Simon!

O problema de login parece ser um conflito com o plugin MemberPress. Então, acho que preciso investigar uma possível solução com eles.

O problema de logout foi causado por um plugin de redirecionamento. Havia um redirecionamento para a página inicial que estava causando o problema com o logout do Discourse.

Michael – agradeço muito sua ajuda e o conselho sobre quais plugins podem ser suspeitos. Isso me economizou muito tempo, pois foram os dois primeiros plugins que verifiquei.

Simon – obrigado por me falar sobre o plugin WordPress Health Check. Eu nunca tinha ouvido falar dele antes, mas vou instalá-lo agora e usá-lo para solucionar problemas no futuro.

Verifique as configurações do plugin em busca de redirecionamentos de login que ele cria. Parece que ele está redirecionando os usuários para a página de perfil antes que o plugin WP Discourse possa redirecioná-los de volta para o Discourse. Se você encontrar a solução, poste-a aqui. Caso não a encontre, avise-nos. Posso tentar instalar o MemberPress no meu site local.

Sim, o plugin Health Check é ótimo para depurar esse tipo de situação.

Olá @simon

Não consegui avançar com o MemberPress na resolução disso. É definitivamente um conflito com o MemberPress, pois é o único plugin onde configurei uma URL de redirecionamento específica, ou seja, /jump.

Não tenho muita certeza de como proceder a partir daqui. Quando alguém faz login no meu site WordPress, quero redirecionar essas pessoas para /jump após o login. Então, o MemberPress está fazendo o seu trabalho nesse aspecto.

Mas quando as pessoas acessam meu site Discourse, por exemplo, community.mydomain.com, elas são redirecionadas para a página de login do WordPress, mas após o login, também são enviadas para /jump em vez de serem redirecionadas de volta ao fórum.

Alguma ideia do que mais posso tentar aqui?

Obrigado - Omer

Você sabe quais configurações ativou no MemberPress para criar o redirecionamento? Tenho uma versão recente do MemberPress instalada no meu site de desenvolvimento, mas não consegui reproduzir nem o problema de login, nem o problema de os usuários não serem deslogados do Discourse.

Seu site WordPress está em uma instalação multisite ou é apenas uma instalação normal do WordPress?

É possível que o problema que você está vendo, de os usuários não serem deslogados do Discourse, seja porque seu site do Discourse está configurado para exigir login para visualizar o conteúdo. Nesse caso, atualizar a página do Discourse iniciará o login SSO. Para deslogar completamente os usuários do Discourse, você também precisa deslogá-los do WordPress. Isso pode ser feito inserindo https://exemplo.com.br/?request=logout na configuração de site logout redirect do Discourse. Substitua exemplo.com.br pelo domínio do seu site WordPress. Me avise se você fez isso e ainda não estiver funcionando.

Oi Simon,

É uma instalação normal do WordPress (não multisite). E o logout foi corrigido.

O problema é com o redirecionamento após o login, ou seja, os usuários não são redirecionados de volta para o site do Discourse após o login no WP. Em vez disso, parece que o MemberPress os está enviando para uma página padrão no WordPress.

–Omer

Você sabe se configurou a página para a qual os usuários são redirecionados nas opções do MemberPress? Se sim, qual opção você configurou para isso?

Sim, eu fiz. Configurei o redirecionamento de página em dois lugares:

  1. MemberPress > Configurações > Conta > “URL para direcionar o membro após o login”

  2. MemberPress > Assinaturas > [Plano de Assinatura] > Avançado > “URL de Redirecionamento Padrão no Login”

Obrigado! Essa é a opção que está causando o problema.

Interessante! Preciso deixar essa configuração lá para quando os membros acessarem o site do WordPress e clicarem em entrar.

Sabe se há algum PHP que eu possa adicionar ao meu functions.php para sobrescrever isso no login do Discourse?

O problema está ocorrendo na função track_and_override_login_redirect_mepr. Essa função está conectada ao filtro mepr-process-login-redirect-url do MemberPress. É possível conectar-se a essa função e substituí-la verificando a consulta que foi definida. Isso pode ser feito com a função wp_get_referer().

Acho que não terei tempo para resolver isso hoje, mas darei outra olhada nos próximos dias.

Dê uma nova olhada nisso enquanto está fresco na minha mente. Adicionar a seguinte função ao arquivo functions.php do meu tema resolveu o problema para mim, mas isso não foi testado muito.

add_filter( 'mepr-process-login-redirect-url', 'wpdc_login_redirect', 12, 3);
function wpdc_login_redirect( $redirect, $user = false, $is_wp_login_page = false ) {
	$referer = wp_get_referer();
	if ( $referer ) {
		$query_params = [];
		parse_str( parse_url( $referer, PHP_URL_QUERY ), $query_params );
		$sso_referer = ! empty( $query_params['redirect_to'] ) && preg_match( '/^\/\?sso/', $query_params['redirect_to'] );
		if ( $sso_referer ) {

			return home_url( $query_params['redirect_to'] );
		}
	}

	return MeprProductsCtrl::track_and_override_login_redirect_mepr( $redirect, $user, $is_wp_login_page );
}

A função está se conectando ao filtro 'mepr-process-login-redirect-url' antes que o MemberPress o faça. Em seguida, verifica o valor dos parâmetros de consulta para ver se a consulta foi iniciada por uma solicitação SSO do Discourse. Se foi, redireciona o usuário para a página inicial do WordPress mantendo os parâmetros de consulta intactos. Isso fará com que o plugin WP Discourse conclua a solicitação SSO. Acredito que isso ainda possa funcionar se sua página inicial estiver protegida pelo MemberPress, mas seria bom confirmar isso.

Se a solicitação não foi iniciada pelo Discourse, o método estático MeprProductsCtrl::track_and_override_login_redirect_mepr é chamado com os argumentos que foram passados para o filtro.

Estou um pouco hesitante em recomendar adicionar esse código ao seu site de produção. Se você tentar, certifique-se de poder remover o código do seu servidor caso ele quebre seu site. Certifique-se de testá-lo com o maior número possível de níveis de usuário/membro.

Isso é INCRÍVEL, Simon! Você é uma estrela do rock!

Também estou relutante em adicionar isso ao meu site de produção imediatamente. Acho que talvez precise configurar um site de teste para fazer isso corretamente.