Проблема с Django CSRF и базовой аутентификацией

У меня большие проблемы с аутентификацией запросов Basic Auth Http в Django с моего веб-сервера Heroku.

Я перепробовал множество различных решений, чтобы решить эту проблему. Сначала я видел Forbidden (Referer checking failed - no Referer.), поэтому мне пришлось добавить дополнительные заголовки Origin и Referer к входящим запросам. Теперь я застрял на Forbidden (CSRF cookie not set.). Что бы я ни пробовал, я не могу избавиться от ошибки. Странно то, что это работает, когда я пытаюсь проверить это локально и попасть в конечную точку с помощью curl, исходящего с моей локальной машины, но это не работает с внешнего сайта (который я меньше контролирую).

Этот завиток работает:

curl -X POST -u 'USERNAME:PASSWORD' -d '["test"]' https://test.mysite.com/api

Я взял кусочки из этого решения: https://stackoverflow.com/a/30875830/2698266

Мой соответствующий код выглядит следующим образом:

в settings.py

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    ...
]
...

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
        "rest_framework.authentication.BasicAuthentication",
        "rest_framework.authentication.SessionAuthentication",
    )
}
...

ALLOWED_HOSTS = ["*.mysite.com", "mysite.herokuapp.com", "127.0.0.1", "external.com"]

...


CORS_ORIGIN_WHITELIST = ["https://external.com"]
CSRF_TRUSTED_ORIGINS = ["https://external.com"]
CORS_REPLACE_HTTPS_REFERER = True

Моя конечная точка API (вебхук):

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, authentication_classes, renderer_classes
from rest_framework.authentication import SessionAuthentication, BasicAuthentication

class CsrfExemptSessionAuthentication(SessionAuthentication):
    # https://stackoverflow.com/a/30875830/2698266

    def enforce_csrf(self, request):
        return

@csrf_exempt
@api_view(("POST",))
@renderer_classes((JSONRenderer, TemplateHTMLRenderer))
@authentication_classes((CsrfExemptSessionAuthentication, BasicAuthentication))
def handle_external_request(request):
  pass

в urls.py:

from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from app import webhooks

urlpatterns = [
  path("webhooks/external", csrf_exempt(webhooks.handle_external_request)),
]

Журналы моего сервера (с подробным выводом заголовков http) выдают следующую ошибку:

forbidden (CSRF cookie not set.): /api
POST /api
{'Host': 'test.mysite.com', 'Connection': 'close', 'Accept-Encoding': 'gzip', 'X-Forwarded-For': 'x.x.x.x,x.x.x.x', 'Cf-Ray': 'xxx', 'X-Forwarded-Proto': 'https', 'Cf-Visitor': '{"scheme":"https"}', 'User-Agent': 'HttpClient/1.0.0', 'Authorization': '*****', 'Origin': 'https://external.com', 'Referer': 'https://test.mysite.com/', 'Cache-Control': 'no-cache, no-store, no-transform', 'Content-Type': 'application/json; charset=utf-8', 'Cf-Connecting-Ip': 'x.x.x.x', 'Cf-Ipcountry': 'US', 'Cdn-Loop': 'cloudflare', 'X-Request-Id': 'xxx', 'X-Forwarded-Port': '443', 'Via': '1.1 vegur', 'Connect-Time': '0', 'X-Request-Start': '1669879363353', 'Total-Route-Time': '0', 'Content-Length': '1356'}
POST /api - 403

Любая помощь или руководство здесь будут признательны, спасибо заранее.

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