Ошибка Django Angular cors: доступ-контроль-разрешение-происхождение не разрешено

Я реализовал аутентификацию в своем приложении django, используя django-rest-auth. Мои настройки в settings.py:

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',
    'corsheaders',
    'rest_framework_docs',
    'tasks'
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'urls'
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
ALLOWED_HOSTS = ['*']

SITE_ID = 1

Я вошел в систему с моего внешнего интерфейса - я получил токен, который я сохранил в своем локальном хранилище. Теперь я делаю простой запрос GET, например:

  getTasks(): Observable<Task[]> {

    let headers = new Headers({ 'Access-Control-Allow-Origin': '*' });
    let options = new RequestOptions({ headers: headers, withCredentials: true  });

    return this.http.get(this.taskUrl, options)
    .map(this.extractData)
    .catch(this.handleError);
  }

Но это дает мне: Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers in preflight response., хотя я включаю учетные данные.

Что я делаю не так?

P.S: если я удалю параметры из POST, ошибки не будет, но я получу неверные данные, потому что мой бэкенд возвращает данные для определенного пользователя.


person Thinker    schedule 22.07.2017    source источник


Ответы (1)


Удалите эту строку,

let headers = new Headers({ 'Access-Control-Allow-Origin': '*' });

из вашей функции getTasks(). Вам не нужно указывать эти параметры для сервера. django-cors-headers позаботится об этом.

person zaidfazil    schedule 22.07.2017
comment
Это сработало, но почему именно? Раньше я всегда добавлял заголовки и учетные данные! - person Thinker; 22.07.2017
comment
Django отклоняет любые запросы с опцией Access-Control-Allow-Origin в заголовке. Вам не нужно указывать это явно. - person zaidfazil; 22.07.2017
comment
Клиент отправляет Access-Control-Request-Headers для запроса разрешения определенных заголовков, сервер отвечает с помощью Access-Control-Allow-Headers, в котором перечислены фактические заголовки, которые он собирается разрешить. Клиент не может требовать, какие заголовки разрешены. - person zaidfazil; 22.07.2017
comment
Хорошо, теперь я понимаю :) Спасибо за объяснение! - person Thinker; 22.07.2017
comment
Тогда не могли бы вы сделать мне одолжение и отметить ответ как выбранный? - person zaidfazil; 23.07.2017
comment
Давайте продолжим обсуждение в чате. - person Thinker; 23.07.2017
comment
Конечно! я просто полностью отказываюсь - person Thinker; 23.07.2017