Discourse 로그인 시 WordPress 대시보드로 리다이렉트됨

처음에 WordPress와 SSO를 설정했을 때는 사용자가 포럼 URL로 이동하면 WordPress 로그인 페이지로 리다이렉트되고, 로그인 후 다시 포럼으로 돌아오도록 되어 있었습니다.

하지만 어느 시점부터 이 동작이 바뀌었고, 어떻게 그렇게 변했는지는 전혀 알 수 없습니다. 이제 WordPress 로그인 후에는 사용자는 WordPress 대시보드로 리다이렉트됩니다.

또한, Discourse에서 로그아웃하면 "You Were Logged Out"이라는 메시지가 표시되지만, “Refresh” 버튼을 클릭해도 실제로 로그아웃이 되지 않는 이상한 점도 있습니다. 여전히 게시글 작성, 답글 달기 등이 가능합니다. 실제로 로그아웃이 되려면 2~3번 로그아웃을 반복해야 하는 경우도 있습니다. 즉, 기능은 작동하지만 일관성이 없습니다.

이 문제를 어떻게 해결할 수 있을지 아이디어가 있으신가요?

아마도 WordPress 플러그인이 라우트를 방해하거나 로그인 함수에 개입하고 있을 가능성이 큽니다. WordPress 플러그인의 절반을 비활성화해 보시고, 그중 어떤 쪽이 문제를 일으키는지 확인한 후, 해당 그룹 내 플러그인도 절반씩 비활성화하는 방식으로 좁혀 가세요.

인증, 멤버십, 로그인과 관련된 플러그인부터 시작해 보세요.

마이클의 답변이 아마도 정확할 것입니다. 또한, 사이트에 WooCommerce 플러그인이 설치되어 있나요? 설치되어 있다면, 문제를 해결하기 위해 사이트에 추가할 수 있는 코드가 있습니다.

로그아웃 문제는 로그인 리디렉션 문제와 관련이 있을 수 있습니다. 플러그인을 비활성화해도 문제가 해결되지 않으면 알려 주세요.

모든 사용자에게 플러그인을 비활성화하고 싶지 않다면, WordPress Health Check 플러그인을 사용하여 개별 세션에서 비활성화할 수 있습니다: Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada).

Michael, Simon 감사합니다!

로그인 문제는 MemberPress 플러그인과 충돌이 원인인 것 같습니다. 그래서 그쪽과 함께 가능한 해결책을 찾아봐야 할 것 같습니다.

로그아웃 문제는 리다이렉트 플러그인 때문이었습니다. 홈페이지 리다이렉트가 Discourse 로그아웃에 문제를 일으키고 있었네요.

Michael – 플러그인 중 의심 대상이 될 수 있는 것에 대한 조언과 도움을 정말 감사드립니다. 제가 처음에 확인한 두 플러그인이 바로 그것들이어서 시간을 많이 절약할 수 있었습니다.

Simon – WordPress Health Check 플러그인에 대해 알려주셔서 감사합니다. 이전에 들어본 적이 없었지만, 지금 바로 설치해서 앞으로 문제 해결 시에 사용하겠습니다.

플러그인의 설정을 살펴보고 로그인 리다이렉트가 생성되는지 확인해 보세요. MemberPress가 WP Discourse 플러그인이 사용자를 Discourse로 다시 리다이렉트하기 전에 사용자 프로필 페이지로 리다이렉트하는 것 같습니다. 해결책을 찾으면 여기에 게시해 주세요. 찾지 못하면 알려 주세요. 제 로컬 사이트에서 MemberPress를 설치해 보고 테스트해 볼 수 있습니다.

네, Health Check 플러그인은 이런 문제를 디버깅하는 데 매우 유용합니다.

안녕하세요, @simon

MemberPress를 사용해 이 문제를 해결하려고 했지만, 아직 진전이 없습니다. MemberPress와 명확한 충돌이 있는 것 같습니다. 왜냐하면 특정 리다이렉트 URL(즉, /jump)을 설정한 유일한 플러그인이 MemberPress이기 때문입니다.

지금부터 어떻게 진행해야 할지 막막합니다. 제 WordPress 사이트에서 사용자가 로그인할 때, 로그인 완료 후 해당 사용자를 /jump로 리다이렉트하길 원합니다. MemberPress는 그 부분에서는 제 역할을 하고 있습니다.

하지만 사람들이 제 Discourse 사이트(예: community.mydomain.com)에 접근하면 WordPress 로그인 페이지로 리다이렉트되는데, 로그인 후에도 포럼으로 돌아가지 않고 /jump로 이동하게 됩니다.

여기서 더 시도해 볼 수 있는 다른 방법이 있을까요?

감사합니다 - Omer

MemberPress에서 리디렉트를 생성하기 위해 어떤 설정을 활성화하셨는지 아시나요? 제 개발 사이트에는 최신 버전의 MemberPress가 설치되어 있지만, 로그인 문제나 사용자가 Discourse에서 로그아웃되지 않는 문제를 재현해 보지 못했습니다.

WordPress 사이트가 멀티사이트(multisite) 설치 환경인지, 아니면 일반적인 WordPress 설치 환경인지 확인해 주실 수 있을까요?

사용자가 Discourse에서 로그아웃되지 않는 문제는 Discourse 사이트에서 콘텐츠 열람에 로그인이 필수로 설정되어 있기 때문일 수 있습니다. 이 경우 Discourse 페이지를 새로고침하면 SSO 로그인이 시작됩니다. 사용자가 Discourse에서 완전히 로그아웃되려면 WordPress에서도 로그아웃해야 합니다. 이를 위해 Discourse의 logout redirect 사이트 설정에 https://example.com/?request=logout을 입력하면 됩니다. example.com은 WordPress 사이트의 도메인으로 교체하세요. 이 조치를 취했는데도 여전히 작동하지 않는다면 알려 주세요.

Simon님,

일반적인 WordPress 설치 환경입니다(멀티사이트가 아닙니다). 그리고 로그아웃 문제는 수정되었습니다.

문제는 로그인 후 리다이렉트 부분입니다. 즉, 사용자가 WP 로그인을 완료한 후 Discourse 사이트로 다시 리다이렉트되지 않습니다. 대신 MemberPress가 사용자를 WordPress의 기본 페이지로 보내는 것으로 보입니다.

–Omer

MemberPress 옵션에서 사용자가 리다이렉트될 페이지를 설정했는지 알고 계신가요? 그렇다면 이 항목에 어떤 옵션을 설정하셨나요?

네, 설정했습니다. 두 가지 위치에 페이지 리디렉트를 설정했어요:

  1. MemberPress > 설정 > 계정 > “로그인 후 멤버를 이동할 URL”

  2. MemberPress > 멤버십 > [멤버십 플랜] > 고급 > “기본 로그인 리디렉션 URL”

감사합니다! 바로 그 옵션 때문에 문제가 발생하고 있습니다.

흥미롭네요! 회원들이 WP 사이트로 가서 로그인 버튼을 클릭할 때를 위해 해당 설정을 그대로 유지해야 합니다.

Discourse 로그인에 대해 이 설정을 무시할 수 있도록 functions.php에 추가할 수 있는 PHP 코드가 있는지 혹시 알고 계신가요?

문제는 track_and_override_login_redirect_mepr 함수에서 발생하고 있습니다. 이 함수는 MemberPress의 mepr-process-login-redirect-url 필터에 연결되어 있습니다. 설정된 쿼리를 확인하여 이 함수에 연결하고 오버라이드할 수 있을 것입니다. 이는 wp_get_referer() 함수를 사용하여 수행할 수 있습니다.

오늘 이 문제를 해결할 시간이 없을 것 같지만, 며칠 안에 다시 한 번 살펴보겠습니다.

이 내용이 아직 선명하게 남아 있을 때 한 번 더 살펴봤습니다. 제 테마의 functions.php 파일에 다음 함수를 추가하니 문제가 해결되었지만, 이 코드는 충분히 테스트되지 않았습니다.

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 );
}

이 함수는 MemberPress가 연결되기 전에 'mepr-process-login-redirect-url' 필터에 연결됩니다. 그런 다음 쿼리 매개변수의 값을 확인하여 해당 쿼리가 Discourse의 SSO 요청으로 시작되었는지 검사합니다. 만약 그렇다면, 쿼리 매개변수가 그대로 유지된 채로 사용자를 WordPress 홈 페이지로 리디렉션합니다. 이렇게 하면 WP Discourse 플러그인이 SSO 요청을 완료하게 됩니다. 제 생각에는 홈 페이지가 MemberPress에 의해 보호되고 있더라도 이 방식이 여전히 작동할 수 있지만, 이를 확인하는 것이 좋습니다.

요청이 Discourse에서 시작되지 않은 경우, 필터에 전달된 인수를 사용하여 정적 메서드 MeprProductsCtrl::track_and_override_login_redirect_mepr이 호출됩니다.

이 코드를 프로덕션 사이트에 추가하는 것을 권장하는 데 약간 망설여집니다. 시도하시게 된다면, 사이트가 손상될 경우 서버에서 코드를 제거할 수 있는지 반드시 확인하십시오. 가능한 한 많은 사용자/멤버십 레벨로 테스트해 보시기 바랍니다.

시몬, 정말 대단해! 당신은 록스타야!

나는 이걸 바로 프로덕션 사이트에 추가하는 것도 꺼려진다. 아마도 제대로 테스트 사이트를 설정해야 할 것 같아.