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

**URL:** https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932
**Category:** Development
**Created:** [11월 8, 2019, 3:30오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932 "2019-11-08T15:30:46Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11월 8, 2019, 3:30오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/1 "2019-11-08T15:30:47Z")

</div>

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

```plaintext
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 호출을 사용하는 경우 등) 주장하지만, 이것은 [여기](https://meta.discourse.org/t/discourse-doesnt-redirect-to-return-sso-url-after-user-logs-in-on-private-site/97201/8?u=pfaffman)에서 언급된 커밋에서 확인한 것과 같은 방식으로 보입니다.

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

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

제 코드입니다:

```ruby
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 내부에 있기 때문에 다르게 동작하게 만드는 무언가가 있는 걸까요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11월 13, 2019, 1:00오전 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/2 "2019-11-13T01:00:33Z")

</div>

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

```plaintext
      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로 리다이렉트됩니다. 하지만 아쉽게도 브라우저에서 로그인 버튼을 클릭할 때는 같은 방식으로 작동하지 않습니다.

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11월 18, 2019, 5:07오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/3 "2019-11-18T17:07:11Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [11월 18, 2019, 11:22오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/4 "2019-11-18T23:22:24Z")

</div>

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11월 18, 2019, 11:43오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/5 "2019-11-18T23:43:53Z")

</div>

아. 아뿔싸.

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

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

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11월 20, 2019, 10:39오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/6 "2019-11-20T22:39:51Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![Anil\_Gupta](https://avatars.discourse-cdn.com/v4/letter/a/58956e/32.png) [@Anil\_Gupta](https://meta.discourse.org/u/Anil_Gupta)
#### Post date: [9월 4, 2020, 10:14오후 UTC](https://meta.discourse.org/t/redirect-to-external-site-in-a-plugin/132932/7 "2020-09-04T22:14:21Z")

</div>

hi @pfaffman

이 문제 해결에 진전이 있었나요? 저는 [asp.net](http://asp.net) core 웹 API에서 [Discourse SSO](https://meta.discourse.org/t/13045?silent=true) 로그인을 사용할 때 동일한 문제를 겪고 있습니다.

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

Angular 웹 앱 → [asp.net](http://asp.net) API → API가 [discourse SSO](https://meta.discourse.org/t/13045?silent=true) 호출 → Discourse가 [asp.net](http://asp.net) 서버 API로 값 반환 → API 서버가 호출을 Angular 앱 URL로 리디렉션 → 브라우저가 'Access control origin header’가 존재하지 않아 discourse URL에 접근할 수 없다는 오류 발생.

![image](https://global.discourse-cdn.com/meta/original/3X/4/2/429c734f00d65e40d19a68af0f83121887af65b7.png)

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

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