Weiterleitung zu einer externen Website in einem Plugin?

Ich versuche, eine externe URL aufzurufen, um sich auf einer Remote-Site einzuloggen, nachdem sich Benutzer bei Discourse eingeloggt haben. Alles, was ich tun muss, ist eine Weiterleitung zu einer URL auf der Remote-Site durchzuführen, die dort die Anmeldung vornimmt und dann zurück zu Discourse weiterleitet. Wenn ich das tue, weigert sich der Browser, aufgrund von CORS weiterzuleiten:

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.

Entwickler der App sagen, dass es daran liegt, dass ich die Weiterleitung falsch durchführe (z. B. mit einem Ajax-Aufruf?), aber das sieht genauso aus wie das, was ich in Commits sehe, die hier erwähnt werden.

Ich bin (wieder einmal) ratlos.

Ich kann nicht sagen, ob ich einfach dumm bin oder ob sie Access-Control-Allow-Origin-Header senden müssen (und falls ja, dann kann das für keinen ihrer Kunden funktionieren? Das scheint weit hergeholt).

Hier ist mein Code:

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 # plugin is enabled and has api key and url
          sign_into_thinkific(user)
        else
          render_serialized(user, UserSerializer)
        end
      end
    end

    def sign_into_thinkific(user)
      # do stuff to generate payload

      redirect_to thinkific_sso_url(payload) # also tried 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

EDIT: Die Entwickler haben eine Rails-App geteilt, die redirect_to genau so verwendet wie ich, und sie behaupten, dass es funktioniert. Gibt es etwas bei Discourse, das bewirkt, dass redirect_to anders behandelt wird, weil es … innerhalb von Ember ist oder so etwas?

Sicher, ich übersehe hier etwas Einfaches. Mein aktueller Versuch lautet:

      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

Wenn ich den Text von redirect_location in einer Datei speichere und sie in meinem Browser öffne, werde ich bei Thinkific angemeldet und zu Discourse weitergeleitet. Leider funktioniert dasselbe nicht, wenn ich im Browser auf „Anmelden

Es tut mir leid, dich damit aufzufordern, @sam, aber ich habe das Gefühl, dass es etwas Diskursespezifisches und Schnelles gibt, bei dem du mir helfen kannst, und ich arbeite jetzt schon seit zwei Wochen daran.

Ich habe meinen Code zum Laufen gebracht, indem ich einen Proxy in die Mitte eingefügt habe, aber das scheint keine sehr gute Lösung zu sein.

Wenn ich versuche, in einem SessionController, den ich überschreibe, eine externe Seite mit redirect_to umzuleiten, erhalte ich einen CORS-Fehler. Der gleiche Code von Thinkific scheint dieses Problem nicht zu haben. Gibt es etwas Besonderes daran, eine Umleitung innerhalb von site_url/session durchzuführen? Muss ich die Umleitung irgendwie über JavaScript durchführen? Wenn ja, könntest du mir bitte den allgemeinen Weg aufzeigen, wie das funktionieren könnte?

Ehrlich gesagt bin ich mir nicht sicher, was hier los ist. redirect_to sollte zu einer externen URL funktionieren.

Oh, verdammt.

Es leitet zwar um, aber es löst eine CORS-Verletzung aus. Das ist bizarre, denn die exakt gleiche Umleitung verursacht in ihrem Rails-Beispielcode keine CORS-Verletzung. Ich hatte gehofft, dass es etwas Besonderes daran ist, dies innerhalb von Ember zu tun. Oder so etwas.

Damit ist meine Hoffnung, dass es etwas Dämliches und Offensichtliches war, dahin.

Vielen Dank. Ich weiß das wirklich zu schätzen.

Ich bin mir ziemlich sicher, dass der Browser eine redirect_to-Anweisung ablehnt, weil das Login-Modal per AJAX (base_url/session) geladen wird, ohne dass die andere Seite CORS-Header sendet.

Ich glaube, ich brauche eine Möglichkeit (ich habe keine Ahnung, wie ich das beschreiben soll), aus dem AJAX-Modus herauszukommen, damit es für den Browser wie eine normale Weiterleitung aussieht und nicht wie eine AJAX-Weiterleitung.

Oder gibt es eine Möglichkeit, die Login-Seite als Nicht-AJAX-Seite zu gestalten?

Hallo @pfaffman,

Hast du bei dieser Situation schon Fortschritte gemacht? Ich habe das gleiche Problem beim Verwenden des Discourse SSO-Logins von einer ASP.NET Core Web API.

Der Browser der Angular-App wirft den Fehler „Accept-Control-Header fehlt