2011-11-10 11 views
23

Tengo un formulario de autenticación común en varios subdominios (example.com, blog.example.com y app.example.com). La forma de la conexión debe presentar estos datos a example.com, independientemente de donde se demuestra, por lo que pensado en utilizar CORS, pero esto:Intercambio de recursos de origen cruzado con credenciales

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com") 

does not work

Así que pensé en hacer lo siguiente, y la comprobación de la cabecera origen de forma manual en el lado del servidor, y permitiendo un Access-Control-Allow-Origin: * para que las solicitudes podrían hacerse, pero, por desgracia, esto surge in the MDN

nota importante: al responder a una solicitud de credenciales, el servidor debe especificar un dominio, una nd no puede usar el cardado comodín.

¿Hay alguna manera de hacer que mi solicitud funcione en varios dominios, y todavía enviar credenciales usando CORS?

+0

Creo que también puede poner comas entre los nombres de dominio. (es decir, sí, puede hacer que funcione en varios dominios). – BrainSlugs83

+1

No lo creo. De la especificación: > En la práctica, la producción de lista de origen o nula es más limitada. En lugar de permitir una lista de orígenes separada por espacios, es un origen único o la cadena "nula". [fuente] (https://www.w3.org/TR/cors/#access-control-allow-origin-response-header) – Nemo

Respuesta

34

dos pensamientos:

1) es que también están incluidos los "Access-Control-Allow-Credenciales: true" de cabecera? Esto es necesario para pasar credenciales de cookie (y el cliente XHR correspondiente debe establecer .withCredentials = true)

2) ¿Ha probado la sugerencia de su enlace y solo incluye el origen de la solicitud actual? Por ejemplo, si aparece una solicitud con el encabezado "Origen: http://blog.example.com", respondería con "Access-Control-Allow-Origin: http://blog.example.com", y no una lista de orígenes. Esto requiere un poco más de trabajo en la implementación del lado del servidor.

3) Otro pensamiento, mencionas que tienes un único formulario de inicio de sesión que debe ser compartido por varios dominios. Bueno, si se trata de un formulario HTML estándar, puede hacer una publicación de formulario regular en todos los dominios. No necesita usar CORS. Simplemente establece la propiedad "acción" del formulario en la url que deseas publicar. Por ejemplo:

<form name="login" action="http://login.example.com/doLogin"> 
+0

Terminé usando (2). De alguna manera, había pasado por alto el método de origen único. – Nemo

1
// cross domain 
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']); 
header('Access-Control-Allow-Credentials: true'); 
+6

No hagas eso sin una verificación estricta del encabezado Origin o abrirás el agujero de seguridad – Tom

+3

Esta respuesta ilustra por qué es imposible tener una seguridad a prueba de tontos, incluso en technicolor !! >. < – BrainSlugs83

+0

OK parece que esto es "en esencia" lo mismo que hacer "*" que puede abrir sutiles huecos de seguridad, por lo que no se recomienda, vea http://stackoverflow.com/questions/12001269/what-are-the- security-risks-of-setting-access-control-allow-origin – rogerdpack

Cuestiones relacionadas