CORS: Não é possível usar curinga no Access-Control-Allow-Origin quando o sinalizador de credenciais é verdadeiro

Eu tenho uma configuração envolvendo

Servidor de frontend (Node.js, domain: localhost: 3000) Backend (Django, Ajax, domínio: localhost: 8000)

Navegador <- webapp <- Node.js (serve o aplicativo)

Navegador (webapp) -> Ajax -> Django (Servir pedidos aJAx POST)

Agora, meu problema aqui é com a configuração CORS que o webapp usa para fazer chamadas Ajax para o servidor backend. No chrome, continuo recebendo

Não é possível usar curinga no Access-Control-Allow-Origin quando o sinalizador de credenciais é verdadeiro.

não funciona no firefox também.

Minha configuração do Node.js é:

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(); }; 

E no Django estou usando este middleware junto com isso

A webapp faz solicitações assim:

 $.ajax({ type: "POST", url: 'http://localhost:8000/blah', data: {}, xhrFields: { withCredentials: true }, crossDomain: true, dataType: 'json', success: successHandler }); 

Então, os headers de solicitação que o webapp envia se parecem:

 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="***" 

E aqui está o header de resposta:

 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 

Onde eu estou errando?!

Edit 1: Eu tenho usado o chrome --disable-web-security , mas agora quero que as coisas realmente funcionem.

Editar 2: Resposta:

Então, solução para mim config do 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/ ) 

Isso é parte da segurança, você não pode fazer isso. Se você quiser permitir credenciais, seu Access-Control-Allow-Origin não deve usar * . Você terá que especificar o protocolo exato + domínio + porta. Para referência, veja estas perguntas:

  1. Subdomínios, portas e protocolos do Access-Control-Allow-Origin Wildcard
  2. Compartilhamento de resources de origem cruzada com credenciais

Além disso * é muito permissivo e invalidaria o uso de credenciais. Portanto, defina http://localhost:3000 ou http://localhost:8000 como o header de origem permitido.

Se você estiver usando express você pode usar o pacote cors para permitir o CORS assim, ao invés de escrever seu middleware;

 var express = require('express') , cors = require('cors') , app = express(); app.use(cors()); app.get(function(req,res){ res.send('hello'); }); 

Se você estiver usando o middleware CORS e desejar enviar withCredential boolean true, poderá configurar o CORS da seguinte forma:

 var cors = require('cors'); app.use(cors({credentials: true, origin: 'http://localhost:3000'})); 

tente:

 const cors = require('cors') const corsOptions = { origin: 'http://localhost:4200', credentials: true, } app.use(cors(corsOptions));