rails origin habilitar error control chrome allow ruby-on-rails rest devise cross-domain cors

ruby on rails - origin - Cómo enviar cabeceras CORS con Devise si el usuario no está autorizado(respuesta 401)



rack cors ruby on rails (2)

Por lo general no nos gustaban los encabezados de CORS. Preferimos usar HAProxy para redireccionar.

Con HAProxy puede configurar todas las solicitudes que lleguen a website.com/api/ para que sean redirigidas internamente a su máquina de rieles.

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

Estoy trabajando en una aplicación, donde el servidor y el cliente que consume api residen en diferentes dominios, así que me gustaría usar CORS . Para hacerlo, tengo que configurar los encabezados http correspondientes en la respuesta del servidor:

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

Este método se utiliza como un before_filter en ApplicationController .

Para algunos recursos el usuario tiene que ser autenticado y autorizado. Las solicitudes se realizan a través de XHR / Ajax. Entonces, si el usuario no está autenticado, Devise enviará una respuesta 401 al cliente, en lugar de redirigir a una página de inicio de sesión. Pero el filtro para establecer los encabezados CORS no se usa para esa respuesta. Por lo tanto, la respuesta 401 no se envía al cliente. Quiero capturar y usar la respuesta 401 en el cliente.

Actualmente estoy usando una solución alternativa al no usar los métodos de autenticación de Devise, sino un fragmento de autenticación personalizado:

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

Esto también se establece como un before_filter en ApplicationController . De esta forma, el filtro para establecer los encabezados CORS se activa y todo funciona bien.

Preferiría usar el comportamiento predeterminado de Devise, pero los encabezados CORS tendrían que establecerse en la respuesta 401. ¿Como hacer esto? ¿Tengo que configurar al warden para eso?

¿Cómo podrían establecerse los encabezados CORS para la respuesta 401 generada por Devise en lugar de crear mi propia respuesta?


Utilicé con éxito la gema rack-cors https://github.com/cyu/rack-cors y describí mi experiencia en mi blog .

Punchline: especifique la orden de middleware para que el manejador de cors esté antes del director:

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