2016-01-10 7 views
5

ich einen lokalen Django Setup wie folgtDjango Localhost CORS nicht funktioniert

Django Rest Framework: localhost:8000

AngularJS frontend: local apache running on http://localservername

I django-cors-headers installiert haben und in meinem settings.py, habe ich Setup meine

CORS_ORIGIN_WHITELIST = (
    'http://localhost', 
    'localservername', 
    'http://localservername', 
    '127.0.0.1' 
) 


MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

Allerdings bekomme ich eine No 'Access-Control-Allow-Origin' header is present on the requested resource. Fehler, wenn ich eine API traf, die von der Rest Framework serviert wird. Wenn ich CORS_ORIGIN_ALLOW_ALL = True einstelle, dann funktionieren die APIs korrekt, aber das ist sehr unsicher für meine serverseitigen Daten.

Was muss ich ändern, um das Problem zu beheben?

+0

Haben Sie "corsheaders.middleware.CorsMiddleware" direkt vor 'django.middleware.common hinzugefügt.CommonMiddleware 'und' corseaders' in 'INSTALLED_APPS'? –

+0

@DaniilRyzhkov, Ja, ich habe, ich werde das zu meiner Frage hinzufügen – Newtt

+0

@HamletHakobyan, das spielt keine Rolle, da meine Anfragen von 'localservername' zu' localhost: 8000' sind – Newtt

Antwort

2

Gemäß http://www.w3.org/Security/wiki/Same_Origin_Policy sollten die Anforderungen von demselben Port, demselben Schema und demselben Host stammen, um als derselbe Ursprung betrachtet zu werden. Hier befindet sich einer Ihrer Server in Port 80 und der andere in 8080.

Ein Ursprung wird durch das Schema, den Host und den Port einer URL definiert. Im Allgemeinen sprechend, Dokumente von verschiedenen Ursprüngen abgerufen werden von gegenseitig isoliert. Wenn zum Beispiel ein Dokument aus http://example.com/doc.html versucht abgerufen, um das DOM eines aus https://example.com/target.html abgerufene Dokument zuzugreifen, wird die User-Agent Zugriff nicht zulassen, weil der Ursprung des ersten Dokuments, (http, example.com, 80), tut stimmt nicht mit dem Ursprung des zweiten Dokuments überein (https, example.com, 443).

0

Ich hatte das gleiche Problem. Durch den Besuch des django-cors-headers -Code mein Fehler gefunden war die folgende:

Während ein kompletter CORS-Header wie dieses (Hinweis Schema und Hostname) aussehen:

Access-Control-Allow-Origin: https://example.com 

Die CORS_ORIGIN_WHITELIST Einstellung will sie in einem Format, das vergleicht zu urlparse.netloc (docs) des Origin -Header, der nur der Host (möglicherweise der Port)

def origin_found_in_white_lists(self, origin, url): 
    return (
     url.netloc in conf.CORS_ORIGIN_WHITELIST or 
     (origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or 
     self.regex_domain_match(origin) 
    ) 

Während die RegEx-Whitelist gegen die vergleicht es komplett Origin -header.

So ist die richtige Einstellung (wie das Beispiel im Setup-Handbuch korrekt erklärt, aber beschreibt nicht richtig) wäre:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

was ein Problem sein kann, wenn Sie nicht wollen, Ihre API zu reden die nicht sichere http-Version einer Website. Verwenden Sie in diesem Fall die RegEx.

Hinweis: Bei der Fehlersuche habe ich festgestellt, dass der CORS-Header komplett fehlt, wenn keine Übereinstimmung gefunden wird. Das bedeutet, dass das Fehlen des Headers kein sicheres Anzeichen für eine vollständige Fehlfunktion der Middleware ist, sondern möglicherweise nur eine Fehlkonfiguration.