Django Nginx обратный прокси CSRF Cookie не установлен
Установка
Используя docker compose, я имею следующее:
Nginx Reverse Proxy <> Docker Django Application with React pages (:8000)
В моем Nginx Reverse Proxy, конфигурация под conf.d
следующая:
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Cookie $http_cookie;
proxy_pass http://frontend:8000;
}
}
В моем Django приложении у меня есть представление, которое устанавливает CSRF токен следующим образом views.py
:
@method_decorator(ensure_csrf_cookie, name='dispatch')`
class GetCSRFToken(APIView): ...
На реакт-страницах моего приложения Django я использую Axios для вызова:
axios.get('http://localhost:8000/csrf_cookie').then(...)
Это получает мой CSRF-токен и сохраняет его как cookie на странице React.
Проблема
Перед развертыванием обратного прокси nginx, при доступе к приложению через localhost:8000
, CSRF токен устанавливается, когда я делаю вызов axios к вышеуказанному представлению и все работает.
Однако, после развертывания обратного прокси nginx, при доступе к приложению через localhost
токен CSRF не устанавливается когда я вызываю вышеуказанное представление.
Еще одно наблюдение: при настроенном обратном прокси nginx, если я посещаю localhost:8000
напрямую и вызываю оттуда axios, CSRF-токен устанавливается .
Похоже, это проблема с обратным прокси. Я могу заставить куки установить значение localhost:8000
только при прямом посещении localhost:8000
.
Но когда я посещаю localhost:8000
через обратный прокси с localhost
, CSRF-токен не установлен.
Пожалуйста, посоветуйте, как решить эту ошибку. Большое спасибо!
Моя установка docker-compose:
version: "3"
services:
nginx:
image: nginx:latest
ports:
- 80:80
- 443:443
volumes:
- ./nginx/app.conf:/etc/nginx/conf.d/default.conf
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- nginx
frontend:
build: ./frontend
command: >
sh -c "python manage.py makemigrations frontendApp &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db