LINUX.ORG.RU

CORS включен, но приходит 403 ошибка

 , ,


0

1

жуть какая-то происходит, помогите пожалуйста разобраться

на localhost:4200 работает проект на angular5, на http://127.0.0.1:8000/ работает проект на django 1.8

из angular делаю post-запрос так:

const params = {
	'user_id': userId,
	'title': title
};

return this.http.post('http://127.0.0.1:8000/app_todo2/create_todo', params)

в ответ сервер, на котором работает django, выводит такое:

[30/Nov/2017 15:07:55]"OPTIONS /app_todo2/create_todo HTTP/1.1" 200 0
[30/Nov/2017 15:07:55]"POST /app_todo2/create_todo HTTP/1.1" 403 2629

при этом в django установлен и включен CORS модуль. вот вырезка из конфига:

...
ALLOWED_HOSTS = [
    '127.0.0.1:8000', 
    'http://localhost:4200/list', 
    'http://localhost:4200', 
    'localhost:4200', 
    'localhost'
]

CORS_ORIGIN_ALLOW_ALL = True

CORS_ORIGIN_WHITELIST = (
    'http://localhost:4200/list',
    'http://localhost:4200',
    'localhost:4200',
    'localhost',
    '127.0.0.1:8000'
)

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT'
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_todo2',
    'corsheaders',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    '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',
    'django.middleware.security.SecurityMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',    
)
...

после отправки запроса через отладчик браузера видно, что предварительный OPTIONS-запрос отработал и вернул код 200. то есть кроссдоменный запрос разрешён: https://i.yapx.ru/gdaV.png

но далее основной запрос возвращает код ошибки 403: https://i.yapx.ru/gdYR.png

при этом на сервере эта страничка существует точно. потому что когда я пытался её получить с отключенным модулем CORS, то она не возвращалась, но в консоли сервера был вывод операторов print, которые я прописал в представлении(view) джанги.

однако


Я могу ошибаться, поправьте, если что, но CORS - это клиентская приблуда, сервер должен нормально отвечать на любой запрос. Попробуй curl'ом отправить запрос на сервер.

hippi90 ★★★★★
()
Ответ на: комментарий от hippi90

Да, все так. 403 скорей всего из-за проверки CSRF, нужно добавить цсрф-хедер на клиенте, или отключить проверку на сервере. Как в пятом ангуларе добавить хедер я хз, но гугл должен подсказать.

provaton ★★★★★
()

вот что бывает когда рользуешься незнамо чем непонятно зачем почему и для чего. корс ваш это один заголовок. в браузере-то страница твоя открывается обычным гет методоМ. отладочник дауненок

anonymous
()
Ответ на: комментарий от anonymous

здесь ставить подпись не обязательно, это форум

prozaik
() автор топика

Правильно выше сказали: выключи csrf. Для SPА защита от такой атаки неактуальна.

nikolnik ★★★
()

вот пример отправки пост-запроса яваскриптом с указанием CSRF:

var token = $("input[name='_csrf']").val();
    var header = "X-CSRF-TOKEN";
    $(document).ajaxSend(function (e, xhr, options) {
      xhr.setRequestHeader(header, token);
    });
    $("#like").click(function() {
        var postId = $("#postId").val();
        $.ajax({
            url : "/sympathy/like",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({
                postId: postId
            })
        }).done(function(data) {
            $("#sympathy").text(data.sympathy);
        });
    });

bvn13 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.