CORS: No se puede usar el comodín en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero

Tengo una configuración que involucra

Servidor frontend (Node.js, dominio: localhost: 3000) Backend (Django, Ajax, dominio: localhost: 8000)

Navegador <- webapp <- Node.js (Sirve la aplicación)

Navegador (aplicación web) -> Ajax -> Django (solicitudes POST ajax de Serve)

Ahora, mi problema aquí es con la configuración de CORS que usa la aplicación web para hacer llamadas Ajax al servidor back-end. 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.

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 tal:

 $.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 el webapp son:

 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 funcionen realmente.

Editar 2: Respuesta:

Entonces, 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/ ) 

Esto es parte de la seguridad, no puedes hacer eso. Si desea permitir credenciales, entonces su Access-Control-Allow-Origin no debe usar * . Deberá especificar el protocolo exacto + dominio + puerto. Para referencia, vea estas preguntas:

  1. Subdominios, puertos y protocolos de comodines Access-Control-Allow-Origin
  2. Intercambio de recursos Cross Origin con credenciales

Además * es demasiado permisivo y podría vencer el uso de credenciales. Así que configure http://localhost:3000 o http://localhost:8000 como el encabezado de origen permitido.

Si usa express , puede usar el paquete cors para permitir CORS, como así en vez 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 el middleware CORS y desea enviar withCredential boolean true, puede configurar CORS de esta 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));