@msnn

Как исправить CORS ошибку Response to preflight request doesn't pass access control check: It does not have HTTP ok status?

Столкнулся с очень навязчивой ошибкой CORS при выполнении межсерверного GET запроса из JS скрипта на свой сервер Apache с развернутым Django проектом. Самое интересное, что POST запрос на регистрацию отрабатывает без проблем. Я отправляю POST с регистрацией пользователя, затем отправляю POST с авторизацией для получения токена, а затем отправляю GET с токеном в Header для получения данных и каждый раз ловлю ошибку на этом этапе. Ошибка имеет следующий текст:

Access to fetch at 'https://server.domain/accounts/all-profiles' from origin 'https://client.domain' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

3 дня я путешествовал по интернету, пробуя различные варианты решения этой проблемы, но положительного результата так и не получил. По-этому очень прошу помощи в этом вопросе. Через Postman запросы отлично работают.

В файл конфигурации Apache apache2.conf добавлял разрешения

<IfModule mod_headers.c>
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header always set Access-Control-Allow-Headers 
    "append,delete,entries,foreach,get,has,keys,set,values,Authorization"
    </IfModule>


Добавлял редирект для проверочного запроса OPTIONS

RewriteEngine On                  
    RewriteCond %{REQUEST_METHOD} OPTIONS 
    RewriteRule ^(.*)$ /blank.html [QSA,L]


Еще такой вариант пробовал

RewriteEngine On
    RewriteCond %{REQUEST_METHOD} OPTIONS
    RewriteRule ^(.*)$ $1 [R=200,L]


Установил SSL для сервера

Установил SSL для клиента

Писал GET запрос и через XMLHttpRequest() и через fetch()

Ниже мой JS запрос XMLHttpRequest()

const loginrequests = new XMLHttpRequest();
    const CheckJWT = 'https://server.domain/accounts/all-profiles'

    function ShowToken() {
        NewTok = localStorage.getItem("SavedToken");
        console.log(NewTok);
        loginrequests.open("GET", registerURL, true);
        loginrequests.setRequestHeader("Authorization", NewTok);
        loginrequests.send();

     }


Ниже мой JS запрос Fetch()

async function postData() {
    NewTok = localStorage.getItem("SavedToken");
    const CheckJWT = 'https://server.domain/accounts/all-profiles'

    const response = await fetch(CheckJWT, {
    method: 'GET', 
    headers: {
      'Authorization': NewTok,
      },
    });
    return await response.json();
    }


Еще ниже главное из моего файла конфигурации Apache apache2.conf

DefaultRuntimeDir ${APACHE_RUN_DIR}

    PidFile ${APACHE_PID_FILE}

    Timeout 300

    KeepAlive On

    MaxKeepAliveRequests 100

    KeepAliveTimeout 5

    User ${APACHE_RUN_USER}
    Group ${APACHE_RUN_GROUP}
    
    HostnameLookups Off

    ErrorLog ${APACHE_LOG_DIR}/error.log

    LogLevel warn

    IncludeOptional mods-enabled/*.load
    IncludeOptional mods-enabled/*.conf

    Include ports.conf

    <Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
    </Directory>

    <Directory /usr/share>
	AllowOverride None
	Require all granted
    </Directory>

    <Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
    </Directory>

    WSGIPassAuthorization On

    AccessFileName .htaccess

    <FilesMatch "^\.ht">
	    Require all denied
    </FilesMatch>


    LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
    LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %O" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent

    IncludeOptional conf-enabled/*.conf

    IncludeOptional sites-enabled/*.conf

    <IfModule mod_headers.c>
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header always set Access-Control-Allow-Headers 
    "append,delete,entries,foreach,get,has,keys,set,values,Authorization"
    </IfModule>

    RewriteEngine On                  
    RewriteCond %{REQUEST_METHOD} OPTIONS 
    RewriteRule ^(.*)$ /blank.html [QSA,L]


Помогите пожалуйста, так как больше нет сил бросать горохом об стену, пробуя варианты, которые не помогают =.(
  • Вопрос задан
  • 19124 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Откройте в браузере консоль разработчика, переключитесь на вкладку "Сеть", воспроизведите ошибку и посмотрите, какие запросы уходят и какие ответы на них возвращаются.
Судя по ошибке, на запрос OPTIONS возвращается не 200 статус.
Ответ написан
@msnn Автор вопроса
Моя проблема заключалась в том, что Django не обрбатывал запросы OPTIONS. Проблема была решена при помощи данного модуля https://pypi.org/project/django-cors-headers/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы