我正在开发一个应用程序,其中服务器和使用 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_filter
in ApplicationController
。
对于某些资源,用户必须经过身份验证和授权。请求是通过 XHR/Ajax 完成的。因此,如果用户未通过身份验证,Devise将向客户端发送 401 响应,而不是重定向到登录页面。但是设置 CORS 标头的过滤器不用于该响应。因此 401 响应不会发送到客户端。我想在客户端捕获并使用 401 响应。
目前,我正在使用一种解决方法,即不使用 Devise 身份验证方法,而是使用自定义身份验证片段:
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_filter
in ApplicationController
。这样,设置 CORS 标头的过滤器就会被触发,并且一切正常。
我更喜欢使用 Devise 的默认行为,但 CORS 标头必须在 401 响应中设置。这个怎么做?我必须为此配置warden吗?
如何为 Devise 生成的 401 响应设置 CORS 标头而不是创建我自己的响应?