CORS: imansible utilizzare il carattere jolly in Access-Control-Allow-Origin quando il flag delle credenziali è true

Ho un setup che coinvolge

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

Browser <- webapp <- Node.js (Servire l'app)

Browser (webapp) -> Ajax -> Django (Serve richieste POST ajax)

Ora, il mio problema qui è con l’installazione CORS che l’applicazione web utilizza per effettuare chiamate Ajax al server di back-end. In cromo, continuo a ricevere

Non è ansible utilizzare il carattere jolly in Access-Control-Allow-Origin quando il flag delle credenziali è true.

neanche su firefox.

La mia configurazione 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 in Django sto usando questo middleware insieme a questo

La webapp effettua richieste in quanto tali:

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

Quindi, le intestazioni delle richieste che invia il webapp assomiglia 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="***" 

Ed ecco l’intestazione della risposta:

 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 

Dove sto andando male ?!

Modifica 1: utilizzo chrome --disable-web-security , ma ora voglio che le cose funzionino davvero.

Modifica 2: risposta:

Quindi, soluzione per me config 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/ ) 

Questa è una parte della sicurezza, non puoi farlo. Se si desidera consentire le credenziali, Access-Control-Allow-Origin non deve utilizzare * . Dovrai specificare il protocollo esatto + dominio + porta. Per riferimento vedi queste domande:

  1. Sottodomini, porte e protocolli con caratteri jolly di Access-Control-Allow-Origin
  2. Condivisione di risorse Cross Origin con credenziali

Inoltre * è troppo permissivo e sconfiggerebbe l’uso delle credenziali. Quindi imposta http://localhost:3000 o http://localhost:8000 come intestazione di origine consentita.

Se stai usando express puoi usare il pacchetto cors per permettere a CORS di farlo invece di scrivere il tuo middleware;

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

Se si utilizza il middleware CORS e si desidera inviare con il withCredential booleano withCredential , è ansible configurare CORS in questo modo:

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

Provalo:

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