플러그인에서 외부 사이트로 리디렉션하는 방법?

Discourse에 로그인한 후 원격 사이트로 로그인하기 위해 외부 URL을 호출하려고 합니다. 제가 해야 할 일은 원격 사이트의 URL로 리디렉션하여 그곳에서 로그인을 수행한 뒤 다시 Discourse로 리디렉션하는 것뿐입니다. 이렇게 하면 브라우저가 CORS 때문에 리디렉션을 거부합니다:

Access to XMLHttpRequest at 'https://SITE/api/sso/v2/sso/jwt?' (redirected from 'https://testing.literatehosting.com/session') from origin 'https://testing.literatehosting.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

해당 앱 개발자들은 제가 리디렉션을 잘못 수행하고 있기 때문이라고(예: ajax 호출을 사용하는 경우 등) 주장하지만, 이것은 여기에서 언급된 커밋에서 확인한 것과 같은 방식으로 보입니다.

(또다시) 막혀 있습니다.

제가 멍청한 것인지, 아니면 그들이 Access-Control-Allow-Origin 헤더를 전송해야 하는지(그렇다면 이 방식은 그들의 어떤 클라이언트에서도 작동하지 않는다는 뜻인데, 이는 터무니없어 보입니다) 판단할 수 없습니다.

제 코드입니다:

after_initialize do
  class ::SessionController
    def login(user)
      puts "\n\n\n\LOGIN happening!\n\n\n\n"
      session.delete(ACTIVATE_USER_KEY)
      log_on_user(user)

      if payload = cookies.delete(:sso_payload)
        sso_provider(payload)
      else
        if true # 플러그인이 활성화되어 있고 API 키와 URL이 있는 경우
          sign_into_thinkific(user)
        else
          render_serialized(user, UserSerializer)
        end
      end
    end

    def sign_into_thinkific(user)
      # 페이로드 생성을 위해 작업 수행

      redirect_to thinkific_sso_url(payload) # 또한 redirect_to 
 generate_url(thinkific_sso_url(payload)) 시도

    end

    def generate_url(url, params = {})
      puts "\n\n\nGenerate URL: #{url}\n\n\n"
      uri = URI(url)
      uri.query = params.to_query
      uri.to_s
    end

    def thinkific_sso_url(payload)
      current_url="https://#{GlobalSetting.hostname}/"
      url = "https://#{SiteSetting.thinkific_site_url}/api/sso/v2/sso/jwt?jwt=#{payload}"
      url += "&return_to=#{URI.escape(current_url)}" 

      url
    end

  end
end

수정: 개발자들이 제가 사용하는 것과 똑같이 redirect_to를 사용하는 Rails 앱을 공유했고, 그들은 그것이 작동한다고 주장합니다. Discourse에는 redirect_to가 . . . Ember 내부에 있기 때문에 다르게 동작하게 만드는 무언가가 있는 걸까요?

분명 제가 놓치고 있는 간단한 부분이 있을 것 같습니다. 제가 최근 시도한 방법은 다음과 같습니다.

      url = thinkific_sso_url(payload)
      redirect_location = "<!DOCTYPE html><html><head><meta http-equiv=\"Refresh\" content = \"5; url='#{url}'\" /></head><body>This is my body</body></html>"
      Rails.logger.info "REDIRECTING... #{redirect_location}"

      render plain: redirect_location

redirect_location에 있는 텍스트를 파일로 저장해서 브라우저로 열면 thinkific에 로그인되고 Discourse로 리다이렉트됩니다. 하지만 아쉽게도 브라우저에서 로그인 버튼을 클릭할 때는 같은 방식으로 작동하지 않습니다.

혹시 해결 방법을 아시는 분 계신가요?

죄송하지만 @sam님을 직접 언급하게 되어 미안합니다. 하지만 Discourse에 특화되어 있고 빠르게 해결할 수 있는 부분이 있는 것 같아 도움을 요청드립니다. 이 문제를 두 주째 고민하고 있거든요.

저는 중간에 프록시를 삽입해서 코드를 동작하게 만들었지만, 이는 좋은 해결책이라고 보기 어렵습니다.

제가 오버라이드하고 있는 SessionController에서 외부 사이트로 redirect_to를 시도하면 CORS 오류가 발생합니다. 동일한 코드를 Thinkific에서는 사용해도 그런 문제가 없는 것 같습니다. site_url/session 내에서 리다이렉트를 수행하는 데 특별한 점이 있을까요? 자바스크립트를 통해 리다이렉트를 수행해야 하는 걸까요? 그렇다면 대략 어떻게 작동하는지 방향을 잡아주실 수 있을까요?

솔직히 여기에서 무슨 일이 일어나고 있는지 확실하지 않습니다. redirect_to는 외부 URL로 작동해야 합니다.

아. 아뿔싸.

리다이렉트는 실제로 일어나긴 하는데, CORS 위반이 발생하네요. 같은 리다이렉트인데, 왜 그들의 Rails 샘플 코드에서는 CORS 위반이 안 일어나는지 정말 기묘합니다. 이건 Ember 안에서 실행할 때 뭔가 특별한 점이 있길 바랐거든요. 뭐, 그런 거겠죠.

어설프고 명백한 문제였길 바랐는데, 그 희망은 물거품이 됐네요.

정말 감사합니다. 많이 고맙습니다.

로그인 모달이 AJAX(base_url/session)로 처리되기 때문에, 브라우저가 CORS 헤더를 보내지 않는 한 redirect_to를 거부한다고 거의 확신합니다.

제가 필요한 것은 (어떻게 설명해야 할지 모르겠지만) AJAX에서 벗어나서 브라우저가 이를 AJAX 내의 리다이렉트가 아닌 일반적인 리다이렉트로 인식하게 하는 방법입니다.

아니면, 로그인을 AJAX가 아닌 페이지로 처리할 수 있는 방법이 있을까요?

hi @pfaffman

이 문제 해결에 진전이 있었나요? 저는 asp.net core 웹 API에서 Discourse SSO 로그인을 사용할 때 동일한 문제를 겪고 있습니다.

Angular 앱 브라우저가 요청이 API에서 Angular 앱으로 리디렉션될 때(discourse가 성공적으로 응답을 보낸 후) 'accept control header’가 존재하지 않는다는 오류를 발생시키고 있습니다.

Angular 웹 앱 → asp.net API → API가 discourse SSO 호출 → Discourse가 asp.net 서버 API로 값 반환 → API 서버가 호출을 Angular 앱 URL로 리디렉션 → 브라우저가 'Access control origin header’가 존재하지 않아 discourse URL에 접근할 수 없다는 오류 발생.

image

Discourse와 asp net API 웹 서버 모두의 CORS 설정은 올바르게 구성되어 있습니다.

이것은 이전에 겪으셨던 문제와 유사해 보입니다. 해결 방법을 알려주시면 감사하겠습니다.