Cookies недоступны в react, но отображаются в инструментах разработчика chrome. Бэкэнд Django RF
У меня проблемы с получением токенов из cookies во фронтенде, хотя я могу видеть cookies, установленные в инструментах разработчика chrome с httpOnly
, установленными на False
. Я выполняю локальную разработку с:
- React frontend (http://localhost:3000/)
- Django backend (http://127.0.0.1:8000/)
- Chrome для веб-браузера, chrome developer для отладки.
В фреймворке для отдыха Django у меня
# views.py
@method_decorator(ensure_csrf_cookie, name="dispatch")
class SetCsrfTokenAPIView(APIView):
permission_classes = (permissions.AllowAny,)
def get(self, request, format=None):
response = Response({"success": "CSRF cookie set"})
response.set_cookie(
"my_cookie", "cookie_value", max_age=3600, secure=True, samesite="None"
)
return response
# settings.py
CORS_ALLOW_ALL_ORIGINS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = "None"
# CSRF_COOKIE_SAMESITE = "Lax"
CSRF_COOKIE_HTTPONLY = False
CORS_EXPOSE_HEADERS = ["Content-Type", "X-CSRFToken"]
SESSION_COOKIE_SAMESITE = None
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
# "*",
]
INSTALLED_APPS = [
...
"rest_framework",
"corsheaders",
]
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
...
]
Используя react frontend, я делаю fetch-запрос к конечной точке, которая попадает в SetCsrfTokenAPIView
.
const data = await fetch(
`${process.env.REACT_APP_API_URL}/auth/csrf/`,
{
method: "GET",
credentials: "include", // This is equivalent to Axios's `withCredentials: true`
headers: {
"Content-Type": "application/json",
},
}
);
Вызов прошел успешно, и я могу видеть значения токенов в инструментах разработчика chrome token в Applications header в Network
Однако, когда я использую js-cookie
, react-cookie
или document.cookie
для получения содержимого cookie, react не может найти ни одного cookie из набора django. Если я напишу запись о куках вручную в chrome developer, то react сможет найти только написанные вручную куки. Ключи и значения (значение Secure
, httpOnly
и т.д.) совпадают с теми, что заданы из django
Как я могу получить доступ к cookies во фронтенде react? Моя цель - извлечь значение и отправить его с помощью заголовка X-CSRFToken
.
Что я сделал до сих пор
Я перелопатил соответствующие форумы по django и stackoverflow. Во многих сообщениях говорится о том, что нужно сделать HttpOnly
на False
в настройках cookie в бэкенде, а во фронтенде установить credentials: "include",
в запросах. Я также пробовал и fetch, и axios.