Отсутствие 'Access-Control-Allow-Origin' на AWS
У меня есть Django REST API, расположенный в AWS ECS, и VueJS фронтенд, расположенный в AWS S3, распространяемый AWS CloudFront, пытающийся связаться с бэкендом, используя Axios, и я продолжаю получать вариации этой ошибки:
Access to XMLHttpRequest at 'https://api.example.com/api/v1/auth/login/' from
origin 'https://example.com' has been blocked by CORS policy: Response to preflight
request doesn't pass access control check: No 'Access-Control-Allow-Origin' header
is present on the requested resource.
Я использую приложение Django django-cors-headers и я настроил его в моем settings.py
файле как,
from corsheaders.defaults import default_headers
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# REST
'rest_framework',
'rest_framework.authtoken',
# testing
'coverage',
# auth
'dj_rest_auth',
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'dj_rest_auth.registration',
# cors
'corsheaders',
...
]
SITE_ID = 1
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ORIGIN_WHITELIST = (
'http://localhost:8080',
'https://example.com',
'https://www.example.com',
)
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_HEADERS = list(default_headers) + (
'X-CSRFTOKEN',
)
CSRF_COOKIE_NAME = "csrftoken"
CSRF_TRUSTED_ORIGINS = [
"crowd-scout.com",
]
На стороне фронтенда я настроил Axios как,
import axios from 'axios';
export const HTTP = axios.create({
baseURL: "https://api.example.com",
withCredentials: true,
xsrfHeaderName: "X-CSRFTOKEN",
xsrfCookieName: "csrftoken",
})
И я пытаюсь отправить данные в мой Django REST API как,
import {HTTP} from '@/common/http'
function getToken (form) {
return HTTP.post('/api/v1/auth/login/', form)
}
На стороне AWS, следуя этой документации, я настроил CloudFront несколькими способами:
- Under CloudFront > Origins I've set
Header Name: Origin
andValue: https://example.com
- Under CloudFront > Behaviors > Cache Key and Origin Requests I've set the following
- Cache policy and origin request policy (recommended)
- Cache policy:
CachingOptimized
- Origin request policy - optional:
CORS-S3Origin
- Response headers policy - optional:
CORS-with-preflight-andSecurityHeadersPolicy
Я также установил эту политику CORS на ведро S3, которое я использую:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"POST",
"DELETE"
],
"AllowedOrigins": [
"https://example.com",
"https://www.example.com"
],
"ExposeHeaders": [
"X-CSRFTOKEN"
]
}
]
Я пытался следовать официальной документации AWS, но пока что это была охота на диких гусей. Есть ли дополнительное место для установки настроек CORS, кроме CloudFront, S3 и Django? Нужно ли мне добавлять заголовки к запросам от клиента?