我试图在用户登录 Discourse 后,调用一个外部 URL 来登录远程站点。我所需要做的只是重定向到远程站点上的某个 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)
# 生成 payload 的相关操作
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 是否因为某些原因(例如,因为它运行在 Ember 内部?)对 redirect_to 的处理方式不同?
