2016-07-04 19 views
1

Ich entwickle einige Website aaa.com mit Django, die domainübergreifende AJAX "GET" Anfragen sendet JSON Daten von bbb.com zu erhalten, die auch auf Django läuft und ist Verwenden des REST-Frameworks An diesem Punkt funktioniert alles gut mit dem Hinzufügen crossDomain: true; withCredentials:true. Und natürlich ist es auf der Serverseite von aaa.com konfiguriert.
...-Allow-Credentials: true; ...-Allow-Origin: bbb.comCross Domain Ajax OPTIONEN Fehler 403 (Django)

Die wichtigste Frage kommt, wenn aaa.com versucht PUT POST DELETE Ajax-Anfragen zu machen. Nach CORS Dokumentation: [https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0], Client-Seite Ajax-Anforderung korrekt ist, und
...-Allow-Headers, ...-Allow-Methods
mit
...-Request-Headers, ...-Request-Methods

so dieser Anforderung ist nicht 'einfach' und vor allem Browser angepasst sendet Preflight-Anfrage aus aaa.com an bbb.com, um zu fragen, ob einige benutzerdefinierte Header und Methoden erlaubt sind.

Alles ist in Ordnung, aber ich bekomme immer noch 403 Fehler. Hier ist die Anforderung/Antwort:

General: 
Request URL:http://bbb.com/api/someapipage/ 
Request Method:OPTIONS 
Status Code:403 Forbidden 
Remote Address:some ip:80 

Response Headers: 
Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:accept, content-type, x-csrftoken, x-requested-with 
Access-Control-Allow-Methods:GET, POST, OPTIONS, HEAD, PUT, DELETE 
Access-Control-Allow-Origin:http://aaa.com 
Allow:GET, POST, HEAD, OPTIONS 
Connection:Keep-Alive 
Content-Language:en 
Content-Type:application/json 
Date:Mon, 04 Jul 2016 14:20:38 GMT 
Keep-Alive:timeout=5, max=100 
Server:gunicorn/19.6.0 
Transfer-Encoding:chunked 
Vary:Accept,Accept-Language,Cookie 
X-Frame-Options:SAMEORIGIN 

Request Headers: 
Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8,ru;q=0.6 
Access-Control-Request-Headers:accept, content-type, x-csrftoken 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:aaa.com 
Origin:http://aaa.com 
Referer:http://aaa.com/ 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 

Nach Woche versucht, dieses Problem zu beheben ich diesen Server realisiert will Vary: Plätzchen auf Pre-flighted Anfrage was unmöglich ist, da Cross-Domain-Pre-Flight-Anfrage nicht Cookie enthalten kann, in seiner Kopfzeile.

Ich begann eine Lösung für dieses Problem zu finden und gefunden: https://code.djangoproject.com/ticket/13217

„Aktivieren django.middleware.locale.LocaleMiddleware führt dazu, dass django ein fügt hinzu‚Vary: Plätzchen‘. Kopfzeile jeder reponse“ So localMiddleware Header hinzugefügt Vary: Cookie auch im Vorfeld OPTIONS Antwort

Es gibt viele Empfehlungen, djang-cors-header zu verwenden, um einige dieser Probleme zu beheben. Die Verwendung dieser Paketfunktion entspricht jedoch meinen Einstellungen auf der Serverseite.

Ich habe auch hübsches Paket gefunden: django-dont-vary-on die, wenn installiert, können Dekoratoren Vary: Cookie zu deaktivieren, aber in meinem Fall muss ich Vary: Cookie nur in OPTIONS Antwort deaktivieren.

Ich bin etwas neu zu Django und eigentlich kann mir nicht vorstellen, was in dieser Situation zu tun ist. Jeder Schritt ist wie auf einem Minenfeld. Gibt es eine Lösung oder einige Alternativen?

Antwort

1

Sie müssen CORS auf die weiße Liste setzen, um auf den Server zuzugreifen.

Falls es sich um eine domänenübergreifende Anforderung handelt, wird die Anforderung Preflight, wenn Sie andere Methoden als GET, HEAD oder POST verwenden.

Auch wenn POST verwendet wird Anforderungsdaten mit einem Content-Type anderer als application/x-www-form-urlencoded, multipart/form-data oder text/plain zu senden, wird es Preflight.

Es ist der Server, mit dem die domänenübergreifende Clientanforderung verarbeitet oder abgelehnt werden kann (Standard).

Wenn Sie also Zugriff auf die serverseitige Anwendung haben, können Sie folgendermaßen vorgehen, um die Antwort zu erhalten.

Auf serverseitige

Installieren django-cors-headers auf Server-Seite und weiße Liste der Client-Domäne oder IP (es ist auch portspezifische)

pip install django-cors-headers 

In settings.py, fügen Sie es in Ihrem INSTALLED_APPS

INSTALLED_APPS = (
... 
    'corsheaders', 
... 
) 

Fügen Sie den corsheaders.middleware.CorsMiddleware in MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    '**corsheaders.middleware.CorsMiddleware**', 
    'django.middleware.common.CommonMiddleware', 
.... 
) 

und definiert eine CORS weiße Liste

CORS_ORIGIN_WHITELIST = (
    'aaa.com', 
) 

Jetzt, da Sie Ihre Kunden in der CORS Whitelist gesetzt haben, werden Sie nun in der Lage sein, einen erfolgreichen Ajax-Request zu machen.

+0

danke für die antwort! Sobald ich Zugriff auf die Server-Seite bekomme, versuche ich Ihre Lösung –

+0

Das hat mein Problem gelöst !!! ich danke dir sehr! –

+0

Ich bin froh, dass es geholfen hat :-) – kapilsdv