Hotwire Rails应用跳转外部服务失败:Turbo请求触发CORS错误如何解决
问题原因
该CORS错误是Turbo的默认行为导致的:Turbo会自动拦截所有站内的链接点击、表单提交请求,用Fetch API发起异步请求实现无刷新导航。当你的后端返回跨域重定向地址时,Fetch请求会触发浏览器的CORS预检校验,而Discourse的SSO端点没有配置允许你站点的跨域访问,因此抛出CORS错误。
可行解决方法
你可以从前端或者后端任选一种方案修复:
方案1:前端禁用Turbo对请求的接管
如果你的SSO请求是点击链接触发的,给对应的a标签添加data-turbo="false"属性即可;如果是你提供的Devise登录表单提交后触发的跳转,修改表单配置添加禁用Turbo的属性:
<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: {class: 'mt-48', data: {turbo: false}}) do |f| %>
修改后表单会走原生浏览器提交逻辑,重定向时会触发全页跳转,不会触发CORS校验。
方案2:后端重定向时添加适配Turbo的配置
修改你的sso控制器方法,重定向时明确允许跨域跳转,同时告知Turbo不需要用异步方式处理该重定向:
def sso secret = "572890bb92bbef8c4634c1bf" sso = SingleSignOn.parse(request.query_string, secret) sso.email = current_user.email # from devise sso.name = current_user.name # this is a custom method on the User class sso.username = current_user.username # from devise sso.external_id = current_user.id # from devise sso.sso_secret = secret redirect_to sso.to_url("https://xxxxxxxx/session/sso_login"), allow_other_host: true, status: :see_other response.set_header('Turbo-Visit', 'false') end
内容的提问来源于stack exchange,提问作者Vishal G
相关产品推荐
相关产品推荐

