Ich habe ein Setup mit
Frontend-Server (Node.js, Domäne: localhost: 3000) <---> Backend (Django, Ajax, Domäne: localhost: 8000)
Browser <- webapp <- Node.js (App bereitstellen)
Browser (Webapp) -> Ajax -> Django (Ajax-POST-Anfragen bedienen)
Mein Problem hier ist das CORS-Setup, mit dem die Webanwendung Ajax-Aufrufe an den Back-End-Server ausführt. In Chrom bekomme ich immer
In Access-Control-Allow-Origin kann kein Platzhalter verwendet werden, wenn das Flag für Anmeldeinformationen wahr ist.
funktioniert auch nicht mit Firefox.
Mein Node.js-Setup lautet:
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 verwende ich diese Middleware zusammen mit dieser
Die Webanwendung stellt Anfragen als solche:
$.ajax({
type: "POST",
url: 'http://localhost:8000/blah',
data: {},
xhrFields: {
withCredentials: true
},
crossDomain: true,
dataType: 'json',
success: successHandler
});
Die von der Webanwendung gesendeten Anforderungsheader sehen also folgendermaßen aus:
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 der Antwortheader:
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 gehe ich falsch?!
Edit 1: Ich habe verwendet chrome --disable-web-security
, möchte aber jetzt, dass die Dinge tatsächlich funktionieren.
Edit 2: Antwort:
Also, 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/
)
http
, es ist der/
am Ende. Ich nehme an, das Weglassen von http könnte funktionieren, aber ich habe einige Jahre nicht wirklich an diesem Zeug gearbeitet, also weiß ich nicht wirklich, was jetzt funktioniert!Antworten:
Dies ist ein Teil der Sicherheit, das können Sie nicht. Wenn Sie Anmeldeinformationen zulassen möchten,
Access-Control-Allow-Origin
dürfen Sie diese nicht verwenden*
. Sie müssen das genaue Protokoll + Domäne + Port angeben. Als Referenz siehe diese Fragen:Außerdem
*
ist es zu freizügig und würde die Verwendung von Anmeldeinformationen verhindern. Stellen Sie alsohttp://localhost:3000
oderhttp://localhost:8000
als zulässigen Ursprungsheader ein.quelle
*
ist zu freizügig und würde die Verwendung von Anmeldeinformationen verhindern."?Wenn Sie CORS-Middleware verwenden und
withCredential
boolean true senden möchten , können Sie CORS folgendermaßen konfigurieren:quelle
Wenn Sie verwenden
express
, können Sie das cors- Paket verwenden, um CORS so zuzulassen, anstatt Ihre Middleware zu schreiben.quelle
app.use(cors({credentials: true}));
django-cors-header
App verwenden. Stellen Sie sicher, dass Sie localhost zurCORS_ORIGIN_WHITELIST
Einstellung hinzufügen undCORS_ALLOW_CREDENTIALS
aufTrue
CORS_ORIGIN_ALLOW_ALL = True
,CORS_ORIGIN_WHITELIST = ( 'localhost' )
undCORS_ALLOW_CREDENTIALS = True
ich bekomme diese Header:Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
Versuch es:
quelle
Wenn Sie alle Ursprünge zulassen und die Anmeldeinformationen wahr halten möchten, hat dies für mich funktioniert:
quelle
(Bearbeiten) Das zuvor empfohlene Add-On ist nicht mehr verfügbar. Sie können es auch mit diesem anderen versuchen
Für Entwicklungszwecke in Chrome wird durch die Installation dieses Add-Ons dieser spezielle Fehler behoben:
Intercepted URLs
Stellen Sie nach der Installation sicher, dass Sie Ihr URL-Muster zum hinzufügen, indem Sie auf das AddOn-Symbol ( CORS , grün oder rot) klicken und das entsprechende Textfeld ausfüllen. Ein Beispiel für ein URL-Muster, das hier hinzugefügt werdenhttp://localhost:8080
soll, ist:*://*
quelle
Dies funktioniert für mich in der Entwicklung, aber ich kann nicht raten, dass es in der Produktion nur eine andere Art ist, die Arbeit zu erledigen, die noch nicht erwähnt wurde, aber wahrscheinlich nicht die beste. Sowieso geht hier:
Sie können den Ursprung aus der Anforderung abrufen und diesen dann im Antwortheader verwenden. So sieht es im Express aus:
Ich weiß nicht, wie das mit Ihrem Python-Setup aussehen würde, aber das sollte leicht zu übersetzen sein.
quelle