2016-01-10 1 views
5

У меня есть локальная установка Django следующим образомДжанго Localhost CORS не работает

Django Rest Framework: localhost:8000

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

Я установил django-cors-headers и в моем settings.py, Я насторить

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

Однако, я получаю No 'Access-Control-Allow-Origin' header is present on the requested resource. всякий раз, когда я ударяю любой API, который подается с Rest Framework. Если я установил CORS_ORIGIN_ALLOW_ALL = True, то работа API будет работать правильно, но это очень небезопасно для моих данных на стороне сервера.

Что мне нужно изменить, чтобы исправить это?

+0

Вы добавили 'corsheaders.middleware.CorsMiddleware' прямо перед' django.middleware.common.CommonMiddleware 'и' corsheaders' в 'INSTALLED_APPS'? –

+0

@ ДаниилРыжков, да, я добавлю это на свой вопрос – Newtt

+0

@HamletHakobyan, это не имеет значения, так как мои запросы от 'localservername' до' localhost: 8000' – Newtt

ответ

2

В соответствии с http://www.w3.org/Security/wiki/Same_Origin_Policy запросы должны быть от одного и того же порта, схемы и хоста, чтобы считаться одним и тем же источником. Здесь один из ваших серверов находится в порту 80, а другой на 8080.

Происхождение определяется схемой, хостом и портом URL-адреса. Обычно говоря, документы, извлеченные из разных источников, выделены от друг к другу. Например, если документ извлекается из http://example.com/doc.html пытаются получить доступ к DOM документа извлеченного из https://example.com/target.html, агент пользователя запретить доступ, потому что происхождение первого документа (HTTP, example.com, 80), делает не совпадают с началом второго документа (https, example.com, 443).

0

У меня была та же проблема. Просматривая django-cors-headers -кода нашел моя ошибка заключалась в следующем:

Хотя полное CORS-заголовок выглядит следующим образом (уведомление схемы и имя хоста):

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

Установка CORS_ORIGIN_WHITELIST хочет его в формате, который сопоставляет чтобы urlparse.netloc (docs) от Origin -header, который является только хост (возможно порт)

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

в то время как RegEx-белый список сравнивает его против полный Origin -header.

Так правильная установка (как, например, в настройки-инструкции правильно говорится, но не правильно описывает) будет:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

Что может быть проблемой, если вы не хотите, чтобы ваш API поговорить незащищенную http-версию веб-сайта. Используйте RegEx в этом случае.

Также обратите внимание: во время поиска неисправностей я узнал, что заголовок CORS полностью отсутствует, если совпадение не найдено. Это означает, что отсутствие заголовка не является верным признаком полной неисправности промежуточного программного обеспечения, но, возможно, просто неправильной конфигурацией.