Я разрабатываю сайт 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.
Я немного нового для джанго и на самом деле даже не могу себе представить, что делать в этой ситуации. Каждый мой шаг - это просто прогулка по минной области. Есть ли какое-либо решение или какие-то альтернативы?
Благодарим вас за ответ! как только я получу доступ к серверной стороне, я попробую ваше решение. –
Это решило мою проблему !!! Спасибо большое! –
Я рад, что это помогло :-) – kapilsdv