Tengo una configuración que involucra
Servidor frontend (Node.js, dominio: localhost: 3000) <---> Backend (Django, Ajax, dominio: localhost: 8000)
Navegador <- webapp <- Node.js (Servir la aplicación)
Navegador (aplicación web) -> Ajax -> Django (Servir solicitudes POST de ajax)
Ahora, mi problema aquí es con la configuración de CORS que utiliza la aplicación web para hacer llamadas Ajax al servidor de fondo. En cromo, sigo obteniendo
No se puede usar comodín en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero.
tampoco funciona en firefox.
Mi configuración de Node.js es:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
};
Y en Django estoy usando este middleware junto con este
La aplicación web realiza solicitudes como tales:
$.ajax({
type: "POST",
url: 'http://localhost:8000/blah',
data: {},
xhrFields: {
withCredentials: true
},
crossDomain: true,
dataType: 'json',
success: successHandler
});
Entonces, los encabezados de solicitud que envía la aplicación web se ven así:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"
Y aquí está el encabezado de respuesta:
Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json
¿Dónde me estoy equivocando?
Edición 1: He estado usando chrome --disable-web-security
, pero ahora quiero que las cosas realmente funcionen.
Edición 2: Respuesta:
Entonces, la solución para mí django-cors-headers
config:
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)
http
, es/
el final. Supongo que omitir http podría funcionar, pero realmente no he trabajado en estas cosas durante algunos años, ¡así que realmente no sé qué funciona ahora!Respuestas:
Esto es parte de la seguridad, no puedes hacer eso. Si desea permitir credenciales, entonces
Access-Control-Allow-Origin
no debe usarlas*
. Deberá especificar el protocolo exacto + dominio + puerto. Para referencia vea estas preguntas:Además
*
es demasiado permisivo y derrotaría el uso de credenciales. Establezcahttp://localhost:3000
ohttp://localhost:8000
como el encabezado de origen permitido.fuente
*
es demasiado permisivo y vencería el uso de credenciales"?Si está utilizando el middleware CORS y desea enviar
withCredential
boolean true, puede configurar CORS de esta manera:fuente
Si estas usando
express
, puede usar el paquete cors para permitir CORS así en lugar de escribir su middleware;fuente
app.use(cors({credentials: true}));
django-cors-header
aplicación. Asegúrese de agregar localhost a laCORS_ORIGIN_WHITELIST
configuración y establecerCORS_ALLOW_CREDENTIALS
enTrue
CORS_ORIGIN_ALLOW_ALL = True
,CORS_ORIGIN_WHITELIST = ( 'localhost' )
yCORS_ALLOW_CREDENTIALS = True
obtengo estos encabezados:Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
intentalo:
fuente
Si desea permitir todos los orígenes y mantener verdaderas las credenciales, esto funcionó para mí:
fuente
(Editar) El complemento previamente recomendado ya no está disponible, puedes probar este otro
Para fines de desarrollo en Chrome, la instalación de este complemento eliminará ese error específico:
Después de la instalación, asegúrese de agregar su patrón de URL al
Intercepted URLs
hacer clic en el ícono de Complemento ( CORS , verde o rojo) y completar el cuadro de texto correspondiente. Un patrón de URL de ejemplo para agregar aquí que funcionaráhttp://localhost:8080
sería:*://*
fuente
Esto funciona para mí en el desarrollo, pero no puedo aconsejar que en la producción, es solo una forma diferente de hacer el trabajo que aún no se ha mencionado pero que probablemente no sea la mejor. De todos modos aquí va:
Puede obtener el origen de la solicitud, luego usarlo en el encabezado de la respuesta. Así es como se ve en express:
No sé cómo se vería eso con su configuración de Python, pero eso debería ser fácil de traducir.
fuente