我正在开发一个应用程序,服务器和调用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
这个方法用作ApplicationController
中的before_filter
。对于某些资源,用户必须经过身份验证和授权才能访问。请求通过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
在ApplicationController
中。这样就会触发设置CORS头的过滤器,一切都正常工作。
我更喜欢使用Devise的默认行为,但CORS头必须在401响应中设置。如何做到这一点?我需要为此配置warden吗?
如何为Devise生成的401响应设置CORS头,而不是创建自己的响应?