2013-11-02 4 views
158

ist habe ich ein SetupCORS: Kann nicht Wildcard in Access-Control-Allow-Origin verwenden, wenn Anmeldeinformationen Flag true

Frontend-Server beteiligt (Node.js, Domäne: localhost: 3000) < ---> Backend (Django, ajax, Domain: localhost: 8000)

Browser < - Webapp < - Node.js (Serve the app)

Browser (Webapp) -> ajax -> Django (Serve ajax POST Anfragen)

Jetzt ist mein Problem hier mit CORS-Setup, mit dem die Webanwendung Ajax-Aufrufe an den Backend-Server durchführt. In Chrom bekomme ich immer

Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.

funktioniert nicht auf Firefox auch nicht.

Mein Node.js Setup ist:

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

Und in Django Ich verwende this middlewarealong with this

Die Webapp macht Anfragen als solche:

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

Also, die Request-Header dass die webapp sendet sieht aus wie:

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

Und hier ist die Antwort-Header:

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 

Wo ich falsch werde ?!

Edit 1: Ich habe chrome --disable-web-security verwendet, aber jetzt wollen Dinge tatsächlich funktionieren.

Edit 2: Antwort:

So Lösung für mich 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/ 
) 
+1

... Ich liebe dich .. .Ich verbrachte Stunden damit, es zu debuggen .... verdammt Firefox gab keine Nachricht zurück! – Daviddd

+0

Für mich ist es localhost: 3000 ohne http, wie folgt aus: CORS_ORIGIN_WHITELIST = ( 'localhost: 3000', ) – Andrei

+0

Haben Sie meinen Sie das Frontend und Backend in einem PC verwenden entwickeln? – fanhualuojin154873

Antwort

145

Dies ist ein Teil der Sicherheit, Sie können das nicht tun. Wenn Sie Anmeldeinformationen zulassen möchten, darf Access-Control-Allow-Origin nicht * verwenden. Sie müssen das genaue Protokoll + Domain + Port angeben. siehe Referenz auf diese Fragen:

  1. Access-Control-Allow-Origin wildcard subdomains, ports and protocols
  2. Cross Origin Resource Sharing with Credentials

Neben * zu freizügig ist und würde die Verwendung von Anmeldeinformationen besiegen. Setzen Sie also http://localhost:3000 oder http://localhost:8000 als Erlaube Herkunft Header.

+10

Aber was, wenn es mehr als eine Domain gibt? – aroth

+4

@aroth Sie können eine Liste von Domains angeben. Verwandte Frage: http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains – user568109

+0

Was passiert, wenn ich die gleiche Fehlermeldung bekomme, aber es gibt keine 'Access-Control-Allow- Headers in der Antwort? – Andy

9

Wenn Sie express verwenden Sie die cors Paket CORS verwenden können, ermöglichen, wie so stattdessen Ihre Middleware zu schreiben;

var express = require('express') 
, cors = require('cors') 
, app = express(); 

app.use(cors()); 

app.get(function(req,res){ 
    res.send('hello'); 
}); 
+8

Ah, jetzt ist das bequemer, aber das Ergebnis ist das gleiche :(BTW, ich benutze 'app.use (cors ({credentials: true}));' – ixaxaar

+1

Vielleicht möchten Sie [this] (https : //github.com/ottoyiu/django-cors-headers) Django CORS Middleware, die getestet wird – Bulkan

+0

Woops, vergessen zu erwähnen, ich benutze das auch! – ixaxaar

4

Wenn Sie CORS-Middleware verwenden und wollen withCredential boolean true senden, können Sie CORS wie folgt konfiguriert werden:

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

Dies ist die Konfiguration, die ich vermisst habe. TK – Santos

+0

Glücklich, dass es geholfen hat :) – Hamid

1

es versuchen:

const cors = require('cors') 

const corsOptions = { 
    origin: 'http://localhost:4200', 
    credentials: true, 

} 
app.use(cors(corsOptions));