Aktivieren von CORS in Google App Engine für eine Django-Anwendung

8

Ich habe versucht, CORS-Header in der Google App-Engine zu aktivieren, aber keine der Methoden, die ich über das Internet gefunden habe, funktionierte für mich.

Meine Anwendung läuft auf Python / Django und ich möchte, dass meine Frontend-Anwendung (die separat gehostet wird) API-Aufrufe an meine Backend-Plattform in Google App Engine senden kann.

In den Versionshinweisen vom Januar 2017 heißt das

  

Wir ändern das Verhalten des ESP (Extensible Service Proxy) so, dass CORS-Anfragen (CROSS = Cross-Origin Resource Sharing) standardmäßig abgelehnt werden.

Es kann hier

gesehen werden

Und die Lösung zum Aktivieren von CORS ist das Hinzufügen des folgenden Snippets zur OpenAPI-Konfiguration des Dienstes.

%Vor%

Also habe ich dieses Beispiel verfolgt und zwei Dateien in meinem erstellt Codebasis

openapi.yml:

%Vor%

openapi-appengine.yml:

%Vor%

Dann habe ich diesen Befehl ausgeführt:

%Vor%

Dann habe ich meine app.yml-Datei bearbeitet, damit sie so aussieht (Der Zusatz war endpoints_api_service. Vor dem Hinzufügen wurde die App ohne Fehler implementiert):

%Vor%

Dann habe ich die Anwendung gerade mit

bereitgestellt %Vor%

Nun wurde die App erfolgreich bereitgestellt, aber sie verhält sich merkwürdig. Alle Anfragen, die eine Antwort von 200 zurückgeben sollen, werfen immer noch einen CORS-Fehler, aber diejenigen, die einen 400-Status zurückgeben, funktionieren.

Beispiel: Die Anmelde-API erwartet diese Felder - E-Mail, Kennwort1, Kennwort2, wobei Kennwort1 mit Kennwort2 identisch sein sollte. Wenn ich jetzt korrekte Parameter sende, bekomme ich HTTP 502 mit

  

Es ist kein 'Access-Control-Allow-Origin'-Header auf der angeforderten Ressource vorhanden. Origin {Herkunft-URL} ist daher nicht erlaubt. Die Antwort hatte den HTTP-Statuscode 502

Aber wenn ich password1 nicht wie password2 sende, erhalte ich HTTP 400 response, von dem ich sicher bin, dass es aus meinem Code kommt, weil die Antwort ein Wörterbuch ist, das in den Code geschrieben wird, wenn password1 und password2 nicht übereinstimmen. Auch in diesem Fall haben die Header Access-Control-Allow-Origin als *, aber im ersten Fall war das nicht wahr

Ich habe auch meine nginx Fehlerprotokolle überprüft und es heißt

  

* 27462 Upstream vorzeitig geschlossene Verbindung beim Lesen der Antwort Kopfzeile

Was mache ich hier falsch? Ist dies der richtige Weg, um CORS in GAE zu aktivieren?

    
Swapnil 29.08.2017, 08:37
quelle

2 Antworten

4

Nachdem ich mehrere Tage mit dem Kopf geschlagen hatte, war ich in der Lage, das wahre Problem herauszufinden. Mein Datenbankserver hat jede Verbindung zum Webapp-Server abgelehnt.

Da im Fall einer HTTP 200-Antwort die Webanwendung einen Datenbankaufruf ausführen soll, versuchte die Webanwendung, sich mit dem Datenbankserver zu verbinden. Diese Verbindung dauerte zu lange und sobald sie die NGINX-Zeit überschritten hatte, schickte NGINX eine Antwort an den Webbrowser mit dem Statuscode 502.

Da der Header 'access-control-allow-origin' aus der Webapp gesetzt wurde, hat NGINX diesen Header in seiner Antwort nicht gesetzt. Daher interpretierte der Browser es als eine CORS-Verweigerung.

Sobald ich die IP-Adresse meiner Webapp-Instanz für den Datenbankserver auf die weiße Liste gesetzt habe, lief alles reibungslos ab

Zusammenfassung:

  1. Es ist keine Datei openapi.yml erforderlich, um CORS für eine Django-Anwendung in einer flexiblen GAE-Umgebung zu aktivieren
  2. Versäumen Sie nicht, die NGINX-Logs zu überprüfen: p

Aktualisierung:

Ich wollte nur meine Antwort aktualisieren, um anzugeben, wie Sie die IP Ihrer Instanz nicht zu den IP-Adressen der SQL-Instanz hinzufügen müssen, die auf der weißen Liste stehen.

Konfigurieren Sie die Datenbanken wie folgt:

%Vor%

Beachten Sie den HOST-Schlüssel in den Datenbanken. GAE hat einen Weg, durch den Sie die IP Ihrer Instanz nicht auf die weiße Liste setzen müssen, aber damit dies funktioniert, sollte der Host die cloudsql-Verbindungszeichenfolge und NICHT die IP der SQL-Instanz sein.

Wenn Sie nicht sicher sind, was Ihre cloudsql-Verbindungszeichenfolge ist, rufen Sie das Google Cloud Platform Dashboard auf und wählen Sie im Abschnitt Speicher die Registerkarte SQL aus. Sie sollten eine Tabelle mit einer Spalte Instanzverbindungsname sehen. Der Wert unter dieser Spalte ist Ihre cloudsql-Verbindungszeichenfolge.

    
Swapnil 05.09.2017, 02:19
quelle
1

Nginx als Ihr Reverse Proxy, also als das Gateway zu Ihrem Server, sollte wer CORS gegen Client-Browser-Anfragen, als erster Kontakt von jenseits zu Ihrem System verwalten. Sollte keiner der Backend-Server sein (weder Ihre Datenbank noch irgendwas).

Hier haben Sie meine Standardkonfiguration, um CORS in nginx von Ajax-Anrufen zu einem eigenen REST-Dienst (backserver glassfish) zu aktivieren. Fühlen Sie sich frei zu überprüfen und zu benutzen und hoffe, es dient Ihnen.

%Vor%     
DvTr 07.09.2017 22:57
quelle