처음에 WordPress와 SSO를 설정했을 때는 사용자가 포럼 URL로 이동하면 WordPress 로그인 페이지로 리다이렉트되고, 로그인 후 다시 포럼으로 돌아오도록 되어 있었습니다.
하지만 어느 시점부터 이 동작이 바뀌었고, 어떻게 그렇게 변했는지는 전혀 알 수 없습니다. 이제 WordPress 로그인 후에는 사용자는 WordPress 대시보드로 리다이렉트됩니다.
또한, Discourse에서 로그아웃하면 "You Were Logged Out"이라는 메시지가 표시되지만, “Refresh” 버튼을 클릭해도 실제로 로그아웃이 되지 않는 이상한 점도 있습니다. 여전히 게시글 작성, 답글 달기 등이 가능합니다. 실제로 로그아웃이 되려면 2~3번 로그아웃을 반복해야 하는 경우도 있습니다. 즉, 기능은 작동하지만 일관성이 없습니다.
아마도 WordPress 플러그인이 라우트를 방해하거나 로그인 함수에 개입하고 있을 가능성이 큽니다. WordPress 플러그인의 절반을 비활성화해 보시고, 그중 어떤 쪽이 문제를 일으키는지 확인한 후, 해당 그룹 내 플러그인도 절반씩 비활성화하는 방식으로 좁혀 가세요.
플러그인의 설정을 살펴보고 로그인 리다이렉트가 생성되는지 확인해 보세요. MemberPress가 WP Discourse 플러그인이 사용자를 Discourse로 다시 리다이렉트하기 전에 사용자 프로필 페이지로 리다이렉트하는 것 같습니다. 해결책을 찾으면 여기에 게시해 주세요. 찾지 못하면 알려 주세요. 제 로컬 사이트에서 MemberPress를 설치해 보고 테스트해 볼 수 있습니다.
MemberPress에서 리디렉트를 생성하기 위해 어떤 설정을 활성화하셨는지 아시나요? 제 개발 사이트에는 최신 버전의 MemberPress가 설치되어 있지만, 로그인 문제나 사용자가 Discourse에서 로그아웃되지 않는 문제를 재현해 보지 못했습니다.
WordPress 사이트가 멀티사이트(multisite) 설치 환경인지, 아니면 일반적인 WordPress 설치 환경인지 확인해 주실 수 있을까요?
사용자가 Discourse에서 로그아웃되지 않는 문제는 Discourse 사이트에서 콘텐츠 열람에 로그인이 필수로 설정되어 있기 때문일 수 있습니다. 이 경우 Discourse 페이지를 새로고침하면 SSO 로그인이 시작됩니다. 사용자가 Discourse에서 완전히 로그아웃되려면 WordPress에서도 로그아웃해야 합니다. 이를 위해 Discourse의 logout redirect 사이트 설정에 https://example.com/?request=logout을 입력하면 됩니다. example.com은 WordPress 사이트의 도메인으로 교체하세요. 이 조치를 취했는데도 여전히 작동하지 않는다면 알려 주세요.
문제는 track_and_override_login_redirect_mepr 함수에서 발생하고 있습니다. 이 함수는 MemberPress의 mepr-process-login-redirect-url 필터에 연결되어 있습니다. 설정된 쿼리를 확인하여 이 함수에 연결하고 오버라이드할 수 있을 것입니다. 이는 wp_get_referer() 함수를 사용하여 수행할 수 있습니다.
이 함수는 MemberPress가 연결되기 전에 'mepr-process-login-redirect-url' 필터에 연결됩니다. 그런 다음 쿼리 매개변수의 값을 확인하여 해당 쿼리가 Discourse의 SSO 요청으로 시작되었는지 검사합니다. 만약 그렇다면, 쿼리 매개변수가 그대로 유지된 채로 사용자를 WordPress 홈 페이지로 리디렉션합니다. 이렇게 하면 WP Discourse 플러그인이 SSO 요청을 완료하게 됩니다. 제 생각에는 홈 페이지가 MemberPress에 의해 보호되고 있더라도 이 방식이 여전히 작동할 수 있지만, 이를 확인하는 것이 좋습니다.
요청이 Discourse에서 시작되지 않은 경우, 필터에 전달된 인수를 사용하여 정적 메서드 MeprProductsCtrl::track_and_override_login_redirect_mepr이 호출됩니다.
이 코드를 프로덕션 사이트에 추가하는 것을 권장하는 데 약간 망설여집니다. 시도하시게 된다면, 사이트가 손상될 경우 서버에서 코드를 제거할 수 있는지 반드시 확인하십시오. 가능한 한 많은 사용자/멤버십 레벨로 테스트해 보시기 바랍니다.