Проблема с 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
Любая помощь или руководство здесь будут признательны, спасибо заранее.