Django + React на GPC Cloud Run, пост-запрос возвращается с ошибкой 403
Я пытаюсь отправить запрос на пост для оплаты с помощью Stripe. Несмотря на множество решений на stackoverflow / рекомендаций от CGPT, мой axios post request все еще получает 403 блокировку.
Я использую react frontend и Django backend.
У меня есть представление get_csrf, которое выглядит следующим образом.
def get_csrf(request): return JsonResponse({"csrf_token": get_token(request)})
Мой react frontend имеет следующее:
axios.defaults.withCredentials = true;
const csrf = await axios.get("https://##########################.run.app/api/get-csrf");
const csrfToken = csrf.data['csrf_token'];
axios.defaults.headers.common['X-CSRFToken'] = csrfToken;
Cookies.set('csrftoken', csrfToken);
document.cookie показывает, что установлен csrfcookie.
Запрос показывает, что X-CSRFToken
и withCredentials
установлены.
При отправке из axios приходит ответ 403.
Журналы GCP сообщают: Forbidden (CSRF cookie not set.): /api/create-payment-intent/
Мои настройки django содержат следующее:
CSRF_TRUSTED_ORIGINS = [
"https://owenmitchell.github.io",
'http://localhost:3000',
"http://127.0.0.1:3000"]
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_SAMESITE = 'None'
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_DOMAIN = 'owenmitchell.github.io'
reactfrontend настроен как страницы на github с указанным выше доменным именем.
Мои настройки CORS следующие:
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000", # Frontend URL
"https://owenmitchell.github.io",
"http://127.0.0.1:3000",
]
CORS_ALLOW_METHODS = [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS",
]
У меня установлен django-cors-headers, 'corsheaders' находится в моих установленных приложениях, а промежуточное ПО cors находится в моем промежуточном ПО сверху.
Пост работает, когда я добавляю декоратор csrf_exempt к представлению, но поскольку пост-запрос обрабатывает платежи, обход защиты кажется мне плохой идеей.
Заранее благодарю за любую помощь, которую вы можете мне предложить.