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!