2016-07-04 5 views
1

Я разрабатываю сайт aaa.com с django, который отправляет запросы ajax «GET» между доменами, чтобы получать json-данные с bbb.com, который также работает на django, и используя структуру REST. На данный момент все работает очень хорошо с добавлением crossDomain: true; withCredentials:true. И, конечно, его конфигурация на серверной стороне aaa.com.
...-Allow-Credentials: true; ...-Allow-Origin: bbb.comПерекрестный домен ajax ОПЦИИ ошибка 403 (Django)

Основная проблема возникает, когда aaa.com пытается сделать PUT POST DELETE запросов AJAX. Согласно CORS документации: [https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0] запрос на стороне клиента Ajax является правильным, и
...-Allow-Headers, ...-Allow-Methods
согласован с
...-Request-Headers, ...-Request-Methods

поэтому этот запрос не «простой» и в первую очередь браузер посылает предполетной запрос от aaa.com на bbb.com, чтобы узнать, разрешены ли определенные пользовательские заголовки и методы.

Все в порядке, но я все еще получаю ошибку 403. Вот запрос/ответ:

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 

После недели попыток решить эту проблему, я понял, что сервер хочет Варах: Cookie на предварительно скребками запроса, который невозможно, так как запрос междоменное предварительно полет не может содержать печенье в его заголовке.

я начал находить какое-то решение этой проблемы и нашли: https://code.djangoproject.com/ticket/13217

«Включение django.middleware.locale.LocaleMiddleware вызывает то, что Джанго добавляет„Vary: Cookie“. Заголовок к каждому réponse» Так localMiddleware добавляет заголовок Vary: Cookie даже в предполетных ответах ОПЦИИ

Существует множество рекомендаций по использованию djang-cors-header для устранения некоторых из этих проблем. Но использование этой функции пакета равно моим настройкам на стороне сервера.

Я также нашел довольно пакет: django-dont-vary-on который, если установлен, может установить декораторы, чтобы выключить Vary: cookie, но в моем случае мне нужно отключить Vary: cookie только в ответе OPTIONS.

Я немного нового для джанго и на самом деле даже не могу себе представить, что делать в этой ситуации. Каждый мой шаг - это просто прогулка по минной области. Есть ли какое-либо решение или какие-то альтернативы?

ответ

1

Чтобы получить доступ к серверу, вы должны сделать CORS своим клиентом.

В случае, если запрос является кросс-доменом, запрос становится предваренным, если вы используете методы, отличные от GET, HEAD или POST.

Кроме того, если POST используется для отправки данных запроса с Content-Type другой , чем применение/х-WWW-форм-urlencoded, многочастному/форм-данных или текст/равнина, она становится preflighted.

Его сервер, который позволяет обрабатывать или отклонять запрос на междоменный клиент (по умолчанию).

Итак, если у вас есть доступ к серверному приложению, вы можете сделать следующее, чтобы получить ответ.

На стороне сервера

Установите django-cors-headers на вашей стороне сервера и белый список домена клиента или IP (это также порт конкретных)

pip install django-cors-headers 

В settings.py, добавьте его в INSTALLED_APPS

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

Добавьте corsheaders.middleware.CorsMiddleware в MIDDLEWARE_CLASSES

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

и определить CORS белого список

CORS_ORIGIN_WHITELIST = (
    'aaa.com', 
) 

Теперь, как вы добавили ваш клиент в белом списке CORS, теперь вы будете иметь возможность сделать запрос на успешный АЯКС.

+0

Благодарим вас за ответ! как только я получу доступ к серверной стороне, я попробую ваше решение. –

+0

Это решило мою проблему !!! Спасибо большое! –

+0

Я рад, что это помогло :-) – kapilsdv

Смежные вопросы