Django-cors-headers не разрешает запрос из разрешенного происхождения

Проблема, с которой я столкнулся, заключается в том, что я не могу получить существующего пользователя из моего NextJS фронтенда. Фреймворк бэкенда, который я использую, это Django (вместе с пакетом django-cors-headers). django-cors-headers не разрешает определенный HTTP запрос, в то время как он должен.

Мой next.config.js содержит перезапись, так что я могу получить доступ к моему бэкенду.

async redirects() {
    return [
      {
        source: '/api/:path*',
        destination: 'http://localhost:8000/:path*/',
        permanent: true,
      },
    ]
  },

А мои настройки django-cors-headers выглядят следующим образом:

# CORS

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:3000',
]

CORS_ALLOWED_ORIGINS = [
    'http://localhost:3000',
    'http://localhost:8000',
    'http://127.0.0.1:3000',
    'http://127.0.0.1:8000',
]

CORS_ALLOW_ALL_ORIGINS = True

Запрос, который потерпел неудачу, пытается получить пользователя с идентификатором 1. Такой пользователь существует, и поэтому запрос должен быть успешным.

fetch(`/api/users/${String(userId)}/`, {
    mode: 'cors',
    credentials: 'include',
    headers: {
      'Content-Type': 'application/json',
    },
  })

Однако, единственное, что я получаю в ответ на запрос, это сообщение об ошибке CORS.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/users/1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Status code: 301.

Похоже, что моя настройка django-cors-headers неверна. Но мне разрешено получить мои JWT-токены. Следующий запрос проходит успешно.

fetch('/api/token', {
    method: 'POST',
    mode: 'cors',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email: mail,
      password,
    }),
  })

Это настройки для заголовков django cors. в settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # add this 
    'corsheaders',        
]

MIDDLEWARE = [
    # add this
    'corsheaders.middleware.CorsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    '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',
]

 # set this
 CORS_ALLOW_ALL_ORIGINS=True

В CORS есть несколько моментов, которые необходимо учитывать. Вы можете найти больше здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers, перейдите к ссылкам Access-Control.

Ваша конфигурация выше, вы установили:

  • CORS_ALLOWED_ORIGINS: http://localhost:8000, ...
  • CORS_ALLOW_METHODS: "DELETE", "GET", "OPTIONS", "PATCH", "POST", "PUT" (по умолчанию)
  • CORS_ALLOW_CREDENTIALS: False (по умолчанию)
  • CORS_ALLOW_HEADERS = [ "accept", "accept-encoding", "authorization", "content-type", "dnt", "origin", "user-agent", "x-csrftoken", "x-requested-with", ] (по умолчанию)

Итак, если ваше приложение использует учетные данные, то измените CORS_ALLOW_CREDENTIALS на True. Если это все еще не работает, проверьте заголовки запроса, убедитесь, что там нет специальных заголовков, а если у вас есть специальные заголовки в запросе, то лучше, чтобы они были внутри CORS_ALLOW_HEADERS.

Я перепробовал практически все, кроме двойной проверки порядка загрузки моего промежуточного ПО... Я решил свою проблему, перейдя от следующего порядка загрузки

MIDDLEWARE = [
    # Default
    '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',
    # CORS
    'corsheaders.middleware.CorsMiddleware',
]

... к

MIDDLEWARE = [
    # CORS
    'corsheaders.middleware.CorsMiddleware',
    # Default
    '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',
]

Я знал, что это должно быть что-то простое, но теперь я просто чувствую себя великим идиотом...

Вернуться на верх