Django REST + API Gateway CORS Проблема с аутентификацией Cognito
У меня проблемы с CORS, скорее всего из-за того, что Frontend (Amplify) - https, а backend (ElasticBeanstalk) - http. Безуспешно пытаюсь исправить ситуацию с помощью API Gateway.
Фронтенд: Приложение React, размещенное на AWS Amplify Бэкэнд: REST-фреймворк Django на Elastic Beanstalk Аутентификация: AWS Cognito API Gateway в качестве прокси между фронтендом и бэкендом
Проблема: Получение CORS-ошибки при попытке фронтенда получить доступ к бэкенду через API-шлюз. При отключенном CORS в Chrome запрос достигает бэкенда, но не проходит с ошибкой Django auth.
Фронтенд (React/TypeScript):
const fetchVideos = async () => {
const session = await fetchAuthSession();
const token = session.tokens?.idToken?.toString();
// Token looks valid: eyJraWQiOiJxTHpReFZa...
const fullUrl = `${BASE_URL}/api/premium-content`;
const response = await fetch(fullUrl, {
method: 'GET',
credentials: 'include',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
}
});
}
Django Settings (base.py):
CORS_ALLOWED_ORIGINS = [
"https://my-frontend.amplifyapp.com",
"http://localhost:5173",
"http://localhost:3000"
]
CORS_ALLOW_CREDENTIALS = True
Конфигурация шлюза API
ANY метод: Интеграция HTTP-прокси с конечной точкой EB
Метод OPTIONS: Mock-интеграция с заголовками:
Access-Control-Allow-Origin: 'https://my-frontend.amplifyapp.com'
Access-Control-Allow-Methods: 'GET,OPTIONS'
Access-Control-Allow-Headers: 'Content-Type,Authorization'
Access-Control-Allow-Credentials: 'true'
Ответы шлюза: 4XX и 5XX включены для CORS
Видим сообщение об ошибке в журнале консоли:
Access to fetch at 'https://[api-gateway-url]/prod/api/premium-content' from origin 'https://my-frontend.amplifyapp.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Что я пробовал
- Настроили CORS в Django с помощью django-cors-headers .
- Настройте CORS API Gateway для ресурсов и ответов шлюза
- Попробовали интеграцию Mock и HTTP Proxy для метода OPTIONS
- Убедились, что токен Cognito генерируется и отправляется правильно
- Добавлены явные CORS-заголовки в метод диспетчеризации Django view
- Попытка обойти стандартную аутентификацию Django в пользу пользовательского Cognito auth