/ / ¿Por qué falla mi solicitud de CORS redirigida? - angularjs, cors

¿Por qué falla mi solicitud de CORS redirigido? - angularjs, cors

Mi problema es con una llamada http de angularjs $ en mi aplicación que se ejecuta en localhost: 8080

var url "https://api.acme.com/RX/v1/user";
$http.get(url).success(function (data) {
alert("yay");
$scope.user = data;
});

La primera solicitud se realiza correctamente con la siguiente respuesta registrada por Chrome:

Status Code:302 Found
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:8080
Location:https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

Esto hace que el navegador realice una segunda solicitud GET a la ubicación de redireccionamiento:

https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

Esta segunda solicitud falla con el siguiente error reportado en Chrome:

XMLHttpRequest cannot load https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser. No "Access-Control-Allow-Origin" header is present on the requested resource. Origin "null" is therefore not allowed access.

Así que tengo una solicitud CORS desde un origen a un urleso permite la solicitud que se está redirigiendo a otra URL que también está configurada para permitir la solicitud. Pero la solicitud de redireccionamiento está fallando. ¿Debo esperar que esto funcione?

Tenga en cuenta que tanto api.acme.com como login.acme.com están configurados para permitir todos los orígenes usando

Access-Control-Allow-Origin: *

Respuestas

2 para la respuesta № 1

El problema fue causado por la configuración del navegadorOrigen a nulo cuando el 302 regresa de la solicitud XHR. Por un lado, esto me parece extraño, ya que seguramente tendría más sentido hacer el 302 con el Origen original, no nulo.

Cuando el origen nulo llegó a nuestro servidor, la implementación CORS de apache tomcat allí (http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter, Tomcat 7.0.52) no devuelve un encabezado Access-Control-Allow-Origin, incluso si el servidor está configurado para permitir TODOS los orígenes. NB: este comportamiento ahora está arreglado en la versión actual de Tomcat 7.

La solución fue utilizar una implementación CORS diferente en el servidor (http://software.dzhuvinov.com/cors-filter.html). Este filtro devuelve Access-Control-Allow-Origin: null y el 302 XHR se realiza correctamente.

Aunque he encontrado una solución, todavía no estoy seguro de dos cosas:

  1. por qué el navegador envía un origen nulo cuando un XHR produce una redirección
  2. si el filtro tomcat o el filtro de software dzhuvinov responden correctamente a Origin null.

1 para la respuesta № 2

vea el paso 6 de esta sección (7.1.7): http://www.w3.org/TR/cors/#redirect-steps

más discusión se puede encontrar aquí: https://code.google.com/p/chromium/issues/detail?id=154967

Desafortunadamente, la convención de transmitir la cadena "nula" hace que parezca que podría ser un error; Lo pensé yo mismo hasta que encontré esto :)


0 para la respuesta № 3

Si usa LoginRequiredMiddleware, asegúrese de agregar la url a LOGIN_EXEMPT_URLS en settings.py.