origin falta control chrome cabecera allow ajax django node.js cors django-cors-headers

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:

  1. Subdominios, puertos y protocolos de comodines Access-Control-Allow-Origin
  2. 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));