2016-01-10 8 views
5

Ho una configurazione locale Django come segueDjango Localhost CORS non funziona

Django Rest Framework: localhost:8000

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

Ho installato django-cors-headers e nel mio settings.py, ho installato il mio

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', 
) 

Tuttavia, ottengo un No 'Access-Control-Allow-Origin' header is present on the requested resource. errore ogni volta che colpisco qualsiasi API che viene servita da Rest Framework. Se imposto lo CORS_ORIGIN_ALLOW_ALL = True, le API funzionano correttamente, ma ciò è altamente insicuro per i miei dati lato server.

Cosa devo modificare per risolvere questo problema?

+0

Hai aggiunto 'corsheaders.middleware.CorsMiddleware' prima di' django.middleware.common.CommonMiddleware 'e' corsheaders' nel tuo 'INSTALLED_APPS'? –

+0

@DaniilRyzhkov, Sì, lo aggiungo alla mia domanda – Newtt

+0

@HamletHakobyan, Non importa in quanto le mie richieste provengono da "localservername' a' localhost: 8000' – Newtt

risposta

2

Come da http://www.w3.org/Security/wiki/Same_Origin_Policy, le richieste devono provenire dalla stessa porta, dallo schema e dall'host da considerare come la stessa origine. Qui uno dei tuoi server è nella porta 80 e l'altro è su 8080.

Un'origine è definita dallo schema, dall'host e dalla porta di un URL. Generalmente parlando , i documenti recuperati da origini distinte sono isolati da a vicenda. Ad esempio, se un documento recuperato da http://example.com/doc.html tenta di accedere al DOM di un documento recuperato dal https://example.com/target.html, l'agente utente impedire l'accesso perché l'origine del primo documento, (http, example.com, 80), lo fa non corrisponde all'origine del secondo documento (https, example.com, 443).

0

Ho avuto lo stesso problema. Con la navigazione del -Codice django-cors-headers trovato il mio errore è stato il seguente:

Mentre un completo CORS-header simile a questa (schema di avviso e l'hostname):

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

L'impostazione CORS_ORIGIN_WHITELIST vuole in un formato che mette a confronto a urlparse.netloc (docs) del Origin -Header, che è solo l'host (possibilmente la porta)

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) 
    ) 

Mentre il RegEx-whitelist confronta contro la completo Origin -header.

Così l'impostazione corretta (come l'esempio nella configurazione-manuale Stati correttamente, ma non descrive correttamente) sarebbe:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

che può essere un problema se non si desidera che l'API con cui parlare la versione http non sicura di un sito web. Usa la RegEx in quel caso.

Nota: durante la risoluzione dei problemi ho scoperto che l'intestazione CORS è completamente assente se non viene trovata alcuna corrispondenza. Ciò significa che l'assenza dell'intestazione non è un'indicazione sicura di un completo malfunzionamento del middleware, ma forse solo un errore di configurazione.