ruby-on-rails - constant - rack cors ruby on rails
Permitir cualquier cosa a través de la Política CORS (6)
¿Cómo puedo deshabilitar cors? Por alguna razón, cargué salvajemente los orígenes y encabezados permitidos, pero mis solicitudes de ajax aún se quejan de que el origen no estaba permitido por mi política de CORS ....
Mi controlador de aplicaciones:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :current_user, :cors_preflight_check
after_filter :cors_set_access_control_headers
# For all responses in this controller, return the CORS access control headers.
def cors_set_access_control_headers
headers[''Access-Control-Allow-Origin''] = ''*''
headers[''Access-Control-Allow-Methods''] = ''POST, GET, OPTIONS''
headers[''Access-Control-Allow-Headers''] = ''*''
headers[''Access-Control-Max-Age''] = "1728000"
end
# If this is a preflight OPTIONS request, then short-circuit the
# request, return only the necessary headers and return an empty
# text/plain.
def cors_preflight_check
if request.method == :options
headers[''Access-Control-Allow-Origin''] = ''*''
headers[''Access-Control-Allow-Methods''] = ''POST, GET, OPTIONS''
headers[''Access-Control-Allow-Headers''] = ''*''
headers[''Access-Control-Max-Age''] = ''1728000''
render :text => '''', :content_type => ''text/plain''
end
end
private
# get the user currently logged in
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
end
rutas:
match "*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" }
match "/alert" => "alerts#create"
match "/alerts" => "alerts#get"
match "/login" => "sessions#create"
match "/logout" => "sessions#destroy"
match "/register" => "users#create"
Editar---
También probé:
config.middleware.use Rack::Cors do
allow do
origins ''*''
resource ''*'',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
en application.rb
--edit 2 ---
El problema es que las Extensiones de Chrome pueden no ser compatibles con CORS, creo. ¿Cómo puedo obtener información sin pasar por CORS? ¿Cómo debo responder a la verificación previa?
Eche un vistazo al middleware rack-cors . Controlará los encabezados CORS de forma configurable.
He tenido un problema similar antes de donde resultó ser el navegador web (Chrome en mi caso) ese fue el problema.
Si está utilizando Chrome, intente ejecutarlo de modo que:
Para ventanas:
1) Crea un acceso directo a Chrome en tu escritorio. Haga clic derecho en el acceso directo y elija Propiedades, luego cambie a la pestaña "Acceso directo".
2) En el campo "Objetivo", añada lo siguiente: -args -disable-web-security
Para Mac, abra una ventana de terminal y ejecútelo desde la línea de comandos: abra ~ / Applications / Google / Chrome.app/ -args -disable-web-security
Sobre la información de:
Pruebe la configuración en /config/application.rb:
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins ''*''
resource ''*'', :headers => :any, :methods => [:get, :post, :options, :delete, :put, :patch], credentials: true
end
end
Simplemente puede agregar la gema rack-cors https://rubygems.org/gems/rack-cors/versions/0.4.0
1er paso: agrega gema a tu Gemfile:
gem ''rack-cors'', :require => ''rack/cors''
y luego guardar y ejecutar la bundle install
2do paso: actualice su archivo config / application.rb agregando esto:
config.middleware.insert_before 0, Rack::Cors do
allow do
origins ''*''
resource ''*'', :headers => :any, :methods => [:get, :post, :options]
end
end
para más detalles, puede ir a rack-cors Specailly si no usa los rieles 5.
Tengo tus mismos requisitos en una API pública para la que utilicé rails-api.
También configuré un encabezado en un filtro anterior. Se parece a esto:
headers[''Access-Control-Allow-Origin''] = ''*''
headers[''Access-Control-Allow-Methods''] = ''POST, PUT, DELETE, GET, OPTIONS''
headers[''Access-Control-Request-Method''] = ''*''
headers[''Access-Control-Allow-Headers''] = ''Origin, X-Requested-With, Content-Type, Accept, Authorization''
Parece que te perdiste el encabezado de Access-Control-Request-Method.
Tuve problemas, especialmente con Chrome también. Lo que hiciste se parece esencialmente a lo que hice en mi aplicación. La única diferencia es que estoy respondiendo con un nombre de host correcto en mis encabezados CORS de origen y no un comodín. Me parece que Chrome es exigente con esto.
Cambiar entre desarrollo y producción es un problema, así que escribí esta pequeña función que me ayuda en el modo de desarrollo y también en el modo de producción. Todas las siguientes cosas suceden en mi application_controller.rb
menos que se indique lo contrario, puede que no sea la mejor solución, pero los rack-cors tampoco me funcionaron, no recuerdo por qué.
def add_cors_headers
origin = request.headers["Origin"]
unless (not origin.nil?) and (origin == "http://localhost" or origin.starts_with? "http://localhost:")
origin = "https://your.production-site.org"
end
headers[''Access-Control-Allow-Origin''] = origin
headers[''Access-Control-Allow-Methods''] = ''POST, GET, OPTIONS, PUT, DELETE''
allow_headers = request.headers["Access-Control-Request-Headers"]
if allow_headers.nil?
#shouldn''t happen, but better be safe
allow_headers = ''Origin, Authorization, Accept, Content-Type''
end
headers[''Access-Control-Allow-Headers''] = allow_headers
headers[''Access-Control-Allow-Credentials''] = ''true''
headers[''Access-Control-Max-Age''] = ''1728000''
end
Y luego tengo esta pequeña cosa en mi application_controller.rb
porque mi sitio requiere un inicio de sesión:
before_filter :add_cors_headers
before_filter {authenticate_user! unless request.method == "OPTIONS"}
En my routes.rb
también tengo esto:
match ''*path'', :controller => ''application'', :action => ''empty'', :constraints => {:method => "OPTIONS"}
y este método se ve así:
def empty
render :nothing => true
end