SSO 연결: 로그인 오류 sso_login

이 문제를 조사한 지 몇 시간이 지났고, 거의 해결된 것 같지만 올바른 방향으로 조금만 밀어주면 될 것 같습니다.

기본적으로 저는 이미 자체 DB에 인증된 사용자가 포함된 React 프로젝트에 Discourse를 헤드리스(headless) 구현으로 통합하려고 합니다.

이를 위해 사용자가 React 페이지에서 로그인할 때, Discourse API와 인증할 수 있도록 사용자의 SSO를 수행하여 적절한 함수 등을 호출할 수 있도록 하려 합니다.

먼저, Discourse URL에서 데이터를 가져오며 리다이렉트를 방지하기 위해 다음과 같이 설정했습니다:

const response = await fetch('https://forum.mysite.com/session/sso', {
    method: 'GET',
    redirect: 'manual', // 리다이렉트 자동 추적을 방지
  });

그다음 전체 검증 과정을 거치고 사용자 정보를 담은 페이로드를 백엔드로 전송하기 위해 다음을 사용합니다:

const loginResponse = await fetch(newurl.toString(), {
    method: 'GET',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: 'manual',
  });

포맷팅과 서명 등 모든 것이 정상적으로 보이지만, 에러가 발생합니다. 그래서 이 부분을 주석 처리하고 생성된 URL을 브라우저에 복사해서 붙여넣어 보니 다음과 같은 결과가 나타났습니다:

Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired add_groups: admin: avatar_force_update: avatar_url: bio: card_background_url: confirmed_2fa: e 

조사를 좀 더 해본 결과, 아래 답변들이 제 문제를 해결하는 데 도움이 될 것 같지만, 제 환경에 맞게 무엇을 변경해야 하는지 여전히 명확하지 않습니다. 또한 force_https는 더 이상 조작할 수 있는 설정이 아닌 것 같습니다(무엇을 하는 설정인지도 확실하지 않아요):

다른 브라우저 세션 때문인 것 같기도 하지만, 확실하지는 않습니다. 그래도 이 문제를 해결하는 데 거의 다 왔다고 생각합니다. 그저 작은 힌트만 필요합니다. 도움이 될 만한 정보가 있다면 알려주세요. 감사합니다!

그렇습니다. discourse_connect_csrf_protection 사이트 설정을 활성화 비활성화하여 이 문제를 우회할 수 있습니다. 이는 기본적으로 true로 설정된 숨겨진 사이트 설정입니다. Rails 콘솔을 통해 활성화해야 합니다.

해당 코드는 여기에서 사용됩니다:

https://github.com/discourse/discourse/blob/581dbca97f2b55c9bbbe40dc3b58a9df7409d77f/app/models/discourse_connect.rb#L48-L54

기본값이 true로 설정되어 있다면, false로 설정해야 한다는 말씀이시죠? 지금 바로 시도해 보겠습니다.

이렇게 하면 해결되는 것 같아요. 정보 감사합니다! 아마도 저는 절대 알아내지 못했을 거예요, 하하