chrome - falta la cabecera cors ''access-control-allow-origin'' ajax
CORS: No se puede usar el comodÃn en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero (4)
Esto es parte de la seguridad, no puedes hacer eso. Si desea permitir las credenciales, su Access-Control-Allow-Origin
no debe usar *
. Tendrás que especificar el protocolo exacto + dominio + puerto. Para referencia ver estas preguntas:
- Subdominios, puertos y protocolos de comodines Access-Control-Allow-Origin
- Intercambio de recursos de origen cruzado con credenciales
Además, *
es demasiado permisivo y anularía el uso de credenciales. Así que configure http://localhost:3000
o http://localhost:8000
como el encabezado de origen permitido.
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 ajax)
Ahora, mi problema aquí es con la configuración de CORS que utiliza la aplicación web para realizar llamadas Ajax al servidor backend. En cromo, sigo recibiendo
No se puede usar el comodín en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero.
Tampoco funciona en Firefox.
La configuración de mi 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 hace peticiones 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 parecen a:
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
¿A dónde me voy mal?
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 mi configuración de django-cors-headers
:
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/
)
Si está utilizando express
, puede usar el paquete cors para permitir CORS así en lugar de escribir su middleware;
var express = require(''express'')
, cors = require(''cors'')
, app = express();
app.use(cors());
app.get(function(req,res){
res.send(''hello'');
});
Si está utilizando middleware CORS y desea enviar withCredential
boolean true, puede configurar CORS de la siguiente manera:
var cors = require(''cors'');
app.use(cors({credentials: true, origin: ''http://localhost:3000''}));
intentalo:
const cors = require(''cors'')
const corsOptions = {
origin: ''http://localhost:4200'',
credentials: true,
}
app.use(cors(corsOptions));