如何与设计发送CORS头文件,如果用户未授权(401响应)(How to send CORS hea

2019-06-25 17:24发布

我工作的一个应用程序,其中服务器和API消费客户端驻留在不同的领域,所以我想用CORS 。 要做到这一点,我必须设置在服务器响应相应的HTTP标头:

def cors_set_access_control_headers
  headers['Access-Control-Allow-Origin'] = 'http://localhost'
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type'
  headers['Access-Control-Max-Age'] = "1728000"
end

此方法被用作before_filterApplicationController

对于一些资源,用户必须进行身份验证和授权。 请求是通过XHR /阿贾克斯完成。 因此,如果用户没有通过验证设计将发送401响应给客户端,而不是重定向到网页的标志。 但设置CORS头过滤器不用于该响应。 因此,该401响应不发送给客户端。 我想赶上并使用在客户端的401响应。

目前我使用不使用的设计验证方法解决方法,但是自定义AUTH片段:

def authenticate_cors_user
  if request.xhr? && !user_signed_in?
    error = { :error => "You must be logged in." }
    render params[:format].to_sym => error, :status => 401
  end
end

这被设置为before_filterApplicationController ,太。 这样的过滤器设置CORS头被触发,一切工作正常。

我宁愿用设计的默认行为,但CORS标头必须在401响应进行设置。 这该怎么做? 我一定要配置监狱长是什么?

如何可以在CORS头由设计产生的,而不是创造我自己的响应401响应设置?

Answer 1:

我成功地使用机架-CORS宝石https://github.com/cyu/rack-cors ,并概述了我的经验我的博客 。

点睛之笔:指定中间件为了使CORS处理程序是监狱长之前:

config.middleware.insert_before Warden::Manager, Rack::Cors


Answer 2:

我们一般不喜欢CORS标头。 我们更喜欢使用HAProxy的对重定向。

随着HAProxy的,你可以设置来website.com/api/被内部重定向到轨机的所有请求。

frontend main *:80
  acl api      path_beg  -i /api
  acl app      path_beg  -i /app
backend app_backend
  reqrep    ^([^\ ]*)\ /app/(.*)  \1\ /\2
  balance   roundrobin
  server    app_files smartphoneapp.localhost:8000
backend api_backend
  reqrep    ^([^\ ]*)\ /api/(.*)  \1\ /\2
  balance   roundrobin
  server    app_api localhost:3000


文章来源: How to send CORS headers with Devise if user not authorized (401 response)