DiscourseConnect 플로우가 더 이상 작동하지 않습니다

DiscourseSSO에서 DiscourseConnect로 업데이트한 이후, 저희 SSO 통합이 작동하지 않고 있습니다.

저희는 SSO를 시작할 수 있는 애플리케이션이 하나인 것이 아니라 여러 개인, 아마도 다소 비전형적인 구성을 갖추고 있습니다. 저희 소프트웨어는 온프레미스(on-prem) 환경이나 클라우드의 멀티 테넌트 환경에 설치될 수 있습니다. 소프트웨어의 각 테넌트 인스턴스에는 저희 Discourse 커뮤니티로 연결되는 SSO 링크가 포함되어 있습니다. 이를 통해 (예를 들어) tenant1.ourcompany.com이나 software.tenant2.com, 또는 something.else.com 등 거의 1,000개에 달하는 서로 다른 위치에서 SSO를 시작할 수 있습니다.

모든 테넌트에 걸쳐 단일 중앙 IDP(신원 제공자)를 가지고 있지 않으며, 각 테넌트는 자체 IDP 솔루션(Google, O365, AD, Okta 등)을 사용할 수 있습니다. 서버 측에서는 계정 탈취를 방지하기 위한 프로세스와 완화 조치가 마련되어 있습니다.

불행히도, 저희의 이러한 접근 방식은 최신 Discourse 업데이트에서 작동이 중단되었습니다. (이 커밋 덕분에: this commit.) 기술적인 관점에서, 이전에는 다음과 같은 플로우가 정상 작동했습니다:

  • 저희 백엔드는 API를 통해 Discourse에서 nonce와 SSO 세부 정보를 획득했습니다.
  • Discourse는 SSO 페이로드를 301 리다이렉트로 특정 단일 주소로 저희에게 반환했습니다.
  • 여기의 서버는 301 리다이렉트를 무시하도록 구성되었습니다(nonce 오류를 피하기 위함). 대신 Location 헤더를 파싱하고, base64 값을 디코딩하여 nonce를 얻은 후, SSO 페이로드를 생성하고 SSO secret으로 서명하여 사용자를 SSO 로그인 URL로 보냈습니다.

nonce가 브라우저 세션에 첨부되도록 변경된 것 같습니다(CSRF 공격을 방지하기 위함). 이로 인해 위에서 설명한 플로우를 시도할 때, 사용자를 Discourse로 다시 보내는 시점에서 클라이언트 브라우저에는 nonce를 위한 _forum_session 쿠키가 없으므로 “nonce 만료” 메시지가 표시됩니다.

이 CSRF 보호를 선택적으로 만들 수 있을까요? 즉, false로 설정할 수 있는 enable_secure_nonce라는 새 설정을 추가하는 것이 가능할까요?

현재로서는 대부분의 고객이 저희 포럼에 접근할 수 없게 되었으며, 모든 고객에게 비밀번호를 설정하도록 해야 하고, 앱 내에서 포럼 알림을 추적하는 기능을 잃게 될 전망입니다. 이로 인해 참여도가 하락할 것입니다. :frowning:

네, 전통적으로 이런 경우를 위해 사이트 설정을 항상 지원해 왔습니다. 설명하기가 매우 어려워 숨김 설정으로 만들 가능성이 높지만,像你처럼 예외적인 경우라면 이를 지원하는 데 동의합니다. 그러면 해당 인스턴스에서 활성화할 수 있습니다.

@david 님이 이 문제를 확인해 보실 것입니다.

이제 rails 콘솔에서 다음을 실행하여 보호 기능을 비활성화할 수 있습니다.

SiteSetting.discourse_connect_csrf_protection=false

이로 인해 발생할 수 있는 위험을 이해하고 수용하는 경우에만 이 작업을 수행해야 합니다. discourse.org에서 호스팅되는 경우, 연락 주시면 설정을 변경해 드리겠습니다.

(cc @rysher 님은 비슷한 요청을 하셨습니다)